当前位置: 首页 > news >正文

2023CCPC秦皇岛站

  • define时间:
#define itn int
#define int long long
#define ind long double
#define yes cout << "Yes"
#define no cout << "No"
#define pii pair<long long, long long>
#define pci pair<char, int>
#define re return;

QOJ补题:第九届中国大学生程序设计竞赛 秦皇岛站(CCPC 2023 Qinhuangdao Site) - Dashboard - Contest - QOJ.ac

G. Path

签到。

读懂题意容易发现,先往右再往下走即满足条件,所以答案为行间差之和+列间差之和。

void solve()
{cin >> n >> m;num = 0;for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1; i <= m; i++){cin >> b[i];}for (int i = 1; i <= n - 1; i++){num += abs(a[i] - a[i + 1]);}for (int i = 1; i <= m - 1; i++){num += abs(b[i] - b[i + 1]);}cout << num;
}

A. Make SYSU Great Again I

构造。

第 i 行在[ i , i ] [ i , i+1]放入两个相邻的数字,可以保证每行 \(gcd=1\)注意最后一行特判

这样第一列是 1 和 n,\(gcd=1\) ;其他列也都是相邻的数字,所以保证每列 \(gcd=1\)

多余的数字随便找空位放就行。

void solve()
{cin >> n >> k;x = 1, y = 1;map<pii, int> mp;for (int i = 1; i <= n * 2 - 2; i++)  //前n-1行{if (i % 2){cout << x << ' ' << y;mp[{x, y}] = 1;y++;}else{cout << x << ' ' << y;mp[{x, y}] = 1;x++;}cout << '\n';}cout << x << ' ' << y << '\n'; //特判最后一行mp[{x, 1}] = 1;mp[{x, y}] = 1;cout << x << ' ' << 1 << '\n';num = max(k - n * 2, 0ll);   //还有多数字的找空随便放for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (num == 0){break;}if (!mp[{i, j}]){cout << i << ' ' << j << '\n';mp[{i, j}] = 1;num--;}}}
}

J.Keyi LIkes Reading

状压dp。

遍历一遍当前态和期望态,先找到可以通过 i -> j 的情况:如果 i -> j 中所有 i 没有但 j 有的加上还小于 m 就可以转移。

具体可见注释。

void solve()
{cin >> n >> m;int maxn = 0;for (int i = 1; i <= n; i++){cin >> x;maxn = max(maxn, x);a[x - 1]++;}int ans = 0;for (int i = 0; i < maxn; i++)  //找出终态{if (a[i])ans |= (1ll << i);}for (int i = 0; i < (1ll << maxn); i++){ // 当前状态for (int j = 0; j < (1ll << maxn); j++){                     // 期望状态if ((i & j) != i) // 剪枝,如果当前状态有但期望没有直接下一个continue;int num = 0;bool ok = 1;for (int k = 0; k < maxn; k++){if (!(i & (1ll << k)) && (j & (1ll << k))){ // 如果当前状态没有,但期望有,就加上num += a[k];if (num > m){ok = 0;break;}}}if (ok)  //说明这种情况下i->j可以转移{e[i].emplace_back(j);}}}fill(dp, dp + N, INT_MAX);dp[0] = 0;for (int i = 0; i < (1ll << maxn); i++){for (auto j : e[i]){dp[j] = min(dp[j], dp[i] + 1);}}cout << dp[ans];
}

D. Yet Another Coffee

贪心。

首先优惠券可以叠加,并且价钱可以为负值。所以我们可以把所有优惠券都给一个商品。

但是每个优惠券有时间限制,可以想到维护一个前 \(i\) 个商品的最小值。

每次到达时间 \(i\),我们就把能用的优惠券都给前 \(i\) 个最小的商品。

vector<int> e[N];
void solve()
{cin >> n >> k;for (int i = 1; i <= n; i++){cin >> a[i];e[i].clear();}for (int i = 1; i <= k; i++){cin >> x >> y;e[x].emplace_back(y);}int idx = 1;for (int i = 1; i <= n; i++){if (a[i] < a[idx])  //维护前i个商品的最小值{idx = i;}for (auto j : e[i])  //把所有优惠券给前i个商品的最小值{a[idx] -= j;}}sort(a + 1, a + 1 + n);sum = 0;for (int i = 1; i <= n; i++){sum += a[i];cout << sum << " ";}
}

F. Mystery of Prime

dp。

对不同类型的变化情况考虑,\(dp[i][j]\) 表示第 i 个数状态为 j 情况下的最少转化数。

$dp[i][0] $表示不变 \([1]\) 表示变成1 \([2]\)表示变成偶数 \([3]\)表示变成除1外的奇数

有四种情况:

  • 如果当前数不变,依次讨论下一个数的四种情况。
  • 如果当前数变成1,对下一个数讨论第1、2、3的情况。
  • 如果当前数变成偶数,对下一个数讨论1、2、4的情况。
  • 如果当前数变成奇数,对下一个数讨论1、3的情况。
void solve()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1; i <= n; i++){for (int j = 0; j < 4; j++){dp[i][j] = INT_MAX;}}dp[1][0] = 0;dp[1][1] = dp[1][2] = dp[1][3] = 1;auto prime=[&](int x){for (int i = 2; i <= sqrt(x); i++){if (x % i == 0){return 0;}}return 1;};for (int i = 1; i < n; i++){// 1. a[i]不变if (prime(a[i] + a[i + 1])){dp[i + 1][0] = min(dp[i + 1][0], dp[i][0]);}if (prime(a[i] + 1)){dp[i + 1][1] = min(dp[i + 1][1], dp[i][0] + 1);}if (a[i] % 2){dp[i + 1][2] = min(dp[i + 1][2], dp[i][0] + 1);}elsedp[i + 1][3] = min(dp[i + 1][3], dp[i][0] + 1);// 2. a[i]变1if (prime(1 + a[i + 1])){dp[i + 1][0] = min(dp[i + 1][0], dp[i][1]);}dp[i + 1][1] = min(dp[i + 1][1], dp[i][1] + 1);dp[i + 1][2] = min(dp[i + 1][2], dp[i][1] + 1);// 3.  a[i]变偶数if (a[i + 1] % 2) //如果下一个是奇数,自适应变成一个互质的偶数{dp[i + 1][0] = min(dp[i + 1][0], dp[i][2]);}dp[i + 1][1] = min(dp[i + 1][1], dp[i][2] + 1);dp[i + 1][3] = min(dp[i + 1][3], dp[i][2] + 1);// 4. a[i]变除1外的奇数if (a[i + 1] % 2 == 0)  //同上,自适应变成一个互质的奇数{dp[i + 1][0] = min(dp[i + 1][0], dp[i][3]);}dp[i + 1][2] = min(dp[i + 1][2], dp[i][3] + 1);}cout << min({dp[n][0], dp[n][1], dp[n][2], dp[n][3]}) << ' ';
}
http://www.rkmt.cn/news/2512.html

相关文章:

  • 11
  • 六、数据通路的功能和基本结构
  • 八、CPU控制器的功能和工作原理
  • Linux命令实践
  • Tkinter 多线程并行任务开发:从秒数丢失到完整显示的踩坑与解决
  • AI 机器视觉检测方案:破解食物包装四大质检难题,筑牢食品安全防线
  • NKOJ全TJ计划——NP1397
  • Window10 关闭Edge浏览器的多选项卡通过Alt+Tab组合键切换的方式
  • 华为鸿蒙(4.0)应用开发(4)—ArkTs开发语言 – 每天进步一点点
  • 2025ICPC网络赛第一场题解
  • .net连接MYSQL数据库字符串参数详细解析(总结)
  • The 3rd Universal Cup. Stage 37: Wuhan
  • Mysql 事务提交回滚退回
  • 鸿蒙前端开发3-ArkTS语言基本语法
  • solo博客容器化运行访问
  • 动态规划DP问题详解,超全,思路全收集
  • SQL入门与实战
  • AI编程⑤:【Cursor保姆级教程】零基础小白从安装到实战,手把手教你玩转AI编程神器!
  • 开发效率翻倍!编码助手+云效 AI 评审如何破解代码质量与速度难题?
  • ai本地部署工具有哪些?新手入门AI推荐这几个
  • 完整教程:HDFS基准测试与数据治理
  • var code = 76cb2b4f-5a26-4a70-a3bf-dc8f2ae5162f
  • 【9月19日最终截稿,SPIE出版】2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)
  • Linux redis 8.2.1源码编译
  • 202003_MRCTF_千层套娃
  • [WPF学习笔记]多语言切换-001
  • 软件设计师知识点总结(一)
  • 【译】Visual Studio 2026 Insider 来了!
  • 西门子SINAMICS S120伺服驱动系统介绍
  • Oracle笔记:11GR2 datagruad 环境搭建BORKER