Processing math: 100%

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的值只会被aiai+1影响,因此我们遍历b数组,直接构造答案数组,并且每次构造第ai+1位的时候都预先把值设置为0,因为第ai+1位的值也会影响到bi+1的值,所以我们先贪心的把最小的填进去肯定是最优的。然后在构造第bi+1位的时候,如果当前bi的值填到上一位不会影响bi1的值,那么再把bi填到上一位去最优。
举例:当b为 3 4 4 5时,先将a填入3 0 这时如果a2填入4,那么maxa1,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;
}
posted @   komushdjk  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
点击右上角即可分享
微信分享提示