Codeforces Round 863 (Div. 3) A-C 赛后思路复盘
A (思维)
思路:观察样例可知数越大放在前面越优。遍历字符串,判断当前位置的数字和要插入的数字的关系,如果要插入的数大于当前数,那么就插入到当前数的前面。string里有一个insert函数,可以把指定字符串插入到指定下标之前。
在原串下标为pos的字符前插入字符串str
basic_string& insert (pos, str);
str从下标为pos1开始数的n个字符插在原串下标为pos的字符前
basic_string& insert (pos,str, pos1, n);
在原串下标为pos的字符前插入n个字符c
basic_string& insert (pos, n, c);
参考自:(https://blog.csdn.net/weixin_45845039/article/details/108909704)
点击查看代码
#include <bits/stdc++.h> using namespace std; #define int long long const int N= 2 * 100010; int a[N]; void solve() { int n,k; cin >> n >> k; string s; cin >> s; bool f = 0; string s1 = to_string(k); for(int i=0; i < s.size(); i ++){ int h = s[i]-'0'; if(k > h){ s.insert(i,s1); f = 1; break; } } if(f==0) cout << s << k <<'\n'; else cout << s << '\n'; } signed main() { int T; cin >> T; while(T --) solve(); return 0; }
B (思维、规律)
思路:在纸上模拟样例可找到规律,因为初始点所在的层数是固定的,因此我们可以找到起始点到正方形边缘的距离,同理也可以找到终点离边缘的距离。这两个相对距离的差值就是我们要移动的最小步数。
点击查看代码
#include <bits/stdc++.h> using namespace std; #define int long long const int N= 2 * 100010; int a[N]; void solve() { int n; int x1,y1,x2,y2; cin >> n >> x1 >> y1 >> x2 >> y2; int ka,kb,kc,kd; if(x1 > y1){ ka = y1 - 1; kb = n - x1; }else { ka = x1 -1; kb = n- y1; } int a1 = min(ka,kb); if(x2 > y2){ kc = y2 - 1; kd = n - x2; }else{ kc = x2 -1; kd = n - y2; } int a2 = min(kc,kd); int ans = abs(a1-a2); cout << ans <<'\n'; } signed main() { int T; cin >> T; while(T --) solve(); return 0; }
C(模拟、贪心)
思路:我们可以每次贪心的选取最小的数,每个bi的值只会被ai和ai+1影响,因此我们遍历b数组,直接构造答案数组,并且每次构造第ai+1位的时候都预先把值设置为0,因为第ai+1位的值也会影响到bi+1的值,所以我们先贪心的把最小的填进去肯定是最优的。然后在构造第bi+1位的时候,如果当前bi的值填到上一位不会影响bi−1的值,那么再把bi填到上一位去最优。
举例:当b为 3 4 4 5
时,先将a填入3 0
这时如果a2填入4,那么max(a1,a2)就等于4,和b1的值冲突,因此4不能填到a2,只能填到a3,后面的数同理。
代码:
点击查看代码
#include <bits/stdc++.h> using namespace std; #define int long long const int N= 2 * 100010; int a[N]; int ans[N]; void solve() { int n; cin >> n; for(int i=1; i <= n-1; i ++) cin >> a[i]; int cnt = 1; ans[0] = 1e9; bool f =0; for(int i = 1; i <= n-1; i ++) { if(i==1){ if(a[i] ==0) { ans[i] = a[i]; ans[i + 1] = a[i]; }else { ans[i] = a[i]; ans[i+1] = 0; } continue; } if(max(a[i],ans[i-1]) >a[i-1]){ ans[i+1] =a[i]; }else if(max(a[i],ans[i-1]) <= a[i-1]){ ans[i] = a[i]; ans[i+1] = 0; } } for (int i = 1; i <= n; i ++) cout << ans[i] << ' '; cout << '\n'; } signed main() { int T; cin >> T; while(T --) solve(); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地