虽然是DIV.3,但是跟上一场DIV.2一样只出了两题。10分钟左右出了A,又过了20分钟写了B,但是有点小bug,又看了遍题目改完了,提交,但是数组开小了re了。加了两拨罚时。比赛还剩一个多小时,而且c题也不难,但是我思路没找对,去用双指针遍历字符串模拟了,而且因为用了getline接受字符串,莫名其妙每次提交的时候会在答案前加个0(答案的初始化)。但我不知道咋改,交了好几发全wa就跑去写D,D想了一会也没啥思路,看看时间不多了又跑回去改C,最后这两题都没出。实际上string可以直接cin输入,而且只需要考虑现有的偶数字符对,然后将其成对删除,剩下的字符串长度就是应该删的字符数。但是比赛的时候为什么没有想到...还是得多练习。
A
大概是说有a个1块钱和b个两块钱,求不能买的最小价钱
很水,讨论一下a和b含0的情况,然后a+2*b+1就行了,时间基本花在读题上了
int t, n,a,b;
int main()
{
ios::sync_with_stdio(false); cout.tie(NULL);
cin >> t;
while (t--) {
cin >> a >> b;
if (a != 0 && b == 0)
cout << a+1 << endl;
else if (a == 0 && b != 0)
cout << 1 << endl;
else if (a == 0 && b == 0)
cout << 1 << endl;
else
cout << a + 2 * b + 1 << endl;
}
return 0;
}
B
有n种糖果,每种糖果有ai个,每次从当前数量最多的种类的糖果开始吃,可以保证吃完糖果的过程中不会连续吃到同一种糖果吗?可以输出YES,否则输出NO
有点细节的思维题,其实很容易想到如果最多数量的糖果比倒数第二大的糖果多两个则必定会连续吃两个一样的(当只剩一种糖果,这种糖果的数量大于1),但是要注意,可能同时存在多种同数量的最多糖果种类
int t, n;
vector<int>arr(3000002, 0);
int main()
{
ios::sync_with_stdio(false); cout.tie(NULL);
cin >> t;
while (t--) {
cin >> n;
for (int j = 1; j <= n; j++) {
cin >> arr[j];
}
sort(arr.begin() + 1, arr.begin() + n + 1);
if (arr[n] - arr[n - 1] >= 2)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}
C
如果一个字符串全是由aabb这样诺干个相同字符对组成的,称其为偶串,空串也是偶串。给定一个字符串,判断其最少经过多少次操作才能变成偶串。
这题也是我卡的比较久的一题,题其实不难,但是我路走错了,其实应该统计相同字符对更方便。设原串长为len,遍历串,如果当前字符出现了两次(使用桶或者map)则将其从字符串中删除,同时长度减二。直到整个串的相同字符对被删除,剩下的都是不能凑对的,剩余串的长度即为我们最少的操作次数。
int t, n;
vector<int>arr(3002,0);
int main()
{
ios::sync_with_stdio(false); cout.tie(NULL);
cin >> t;
while (t--) {
string s;
map<char, int>mp;
cin >> s;
int l = s.length();
for (int j = 0; j < s.length(); j++) {
mp[s[j]]++;
if (mp[s[j]]==2) {
l -= 2; mp.clear();
}
}
cout << l << endl;
}
return 0;
}