String Deletion (CodeForces - 1430D )
题意
给定一个只包含0和1的字符串,每次可选择其中任意一位并删掉,删掉后剩下的字符串会自动删除第一段连续相同的前缀,求最多可以操作多少次使字符串变为空串
思路
首先将连续相同的子串分段,因为每次删除一个字符后会自动删除第一段子串,所以要求最多的操作次数就需要每次删除字符时尽量不减少子串的段数,那么可以每次删除字符时优先选择从字符数>=2的子串删除,如果没有就任意删除,不影响最优结果。选择删除的过程用双指针实现
代码
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 2e5 + 5;
char s[N];
int a[N];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, ans = 0, idx = 0;
scanf("%d", &n);
scanf("%s", s);
int m = strlen(s), l = 1;
for (int i = 1; i < m; i++) {
if (s[i] != s[i - 1]) {
a[idx++] = l;
l = 0;
}
l++;
}
a[idx++] = l;
int p1 = 0, p2 = 0;
while (1) {
while (a[p2] == 1)
p2++;
if (p2 >= idx)
break;
a[p2]--;
p1++;
ans++;
if (p2 < p1)
p2 = p1;
}
if ((idx - p1) & 1)
ans += (idx - p1) / 2 + 1;
else
ans += (idx - p1) / 2;
printf("%d\n", ans);
}
return 0;
}
Flamingoes of Mystery (CodeForces - 1425F)
题意
这是一道交互题,算是第一次做到该种题型,长见识了。
题意就是给一个正整数n,然后有n个盒子,每个盒子都有未知数量的火烈鸟,可以进行n次询问,每次询问给出两个正整数 l 和 r 代表询问从第l个盒子到第r个盒子之间有多少只火烈鸟,n次询问结束后要求输出每个盒子内的火烈鸟数量
思路
思路比较简单,先询问第2个到第n个盒子内火烈鸟的总数,再从第2个开始,每次询问第1个到第 i 个盒子内的火烈鸟的总数,然后利用差分即可求出每个盒子内火烈鸟的数目
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, x;
int a[1005];
scanf("%d", &n);
printf("? 2 %d\n", n);
fflush(stdout);
scanf("%d", &x);
for (int i = 2; i <= n; i++) {
printf("? 1 %d\n", i);
fflush(stdout);
scanf("%d", &a[i]);
}
a[1] = a[n] - x;
printf("! ");
for (int i = 1; i <= n; i++)
printf("%d ", a[i] - a[i - 1]);
puts("");
}