比赛网址:https://codeforces.ml/contest/1321
A:
这一题我哭死啦!!!也怪我思考的不全面吧。刚开始因为读英文的时候本来就有点抵触,之后读题愣是花了很久。题意读懂之后,就差不多有思路啦。我已第一想到的是二分,因为这差不多是一个很正宗的二分的题啦,但我看了数据范围,我就差不多明白了,n的范围只有100,所以这一题直接枚举最大值就好啦,最大还能查过1000不成。但无奈的超时啦!!!当时我第一想法就是,这一题逼我用二分,之后又写了两个二分的算法,直接WA,之后心态直接炸裂!!!后来冷静下来才想到我是那个判断“-1”的条件漏掉了一个,之后加上之后,就过啦。
B:
思路全对,代码没什么错,但是是直接一发过啦。赛后RE!!!就这样,完美的掉分啦。这一题本来就不难,可我却偏偏用vector来存储数据,也怪我平时学的不过扎实,连map可以建立负数到正数的映射都不知道!!!啊啊啊啊,赛后用map写直接过啦。
C:
可能因为前两题的缘故,这一题我当时直接不想写啦。我看到那个字符串的数据范围只有100,我知道就算最暴力的算法一定可以过,可是,我却没有去想,没有去写。赛后看来一下别人的代码。确实吧,自己懂得还是太少啦,string自带的erase操作我都不知道!!!
AC代码如下:
#include <set>
#include <map>
#include <List>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 2e5 + 7;
const LL INF = 1e18;
int main() {
int n;
while(cin >> n) {
string s;
cin >> s;
int ans = 0;
for(int i = 25 ; i >= 1 ; i--) {
for(int j = 0 ; j < s.size() ; j++) {
if(s[j] == 'a' + i) {
if(j == 0) {
if(s[j] - s[j+1] == 1) {
s.erase(s.begin() + j);
j = -1;
ans++;
}
} else if(j == s.size() - 1) {
if(s[j] - s[j-1] == 1) {
s.erase(s.begin() + j);
j = -1;
ans++;
}
} else {
if(s[j] - s[j-1] == 1 || s[j] - s[j+1] == 1) {
s.erase(s.begin() + j);
j = -1;
ans++;
}
}
}
}
}
printf("%d\n",ans);
}
return 0;
}
D:
题解
总而言之,cf的比赛还是得多打,不能在鸽啦,掉分也无所谓,多掉掉,还能掉成负分不成!!!