题目链接:https://codeforces.com/contest/600
A - Extract Numbers
一个很无聊的模拟,难度居然是1600,看来当时的竞赛和现在完全不一样。
B - Queries about less or equal elements
排个序二分一下,很无聊的一个题。注意应该使用upper_bound。
*C - Make Palindrome
一开始以为是随便贪心一下的无聊题,结果WA15了。
题意:给一个串s,可以对它进行重排,然后修改其中的一些字母。修改最少的次数使得他变成回文串,假如修改次数最少的有多种方案,求结果字典序最小的一种。
题解:假如串是奇数长度,那么可以容纳一个奇数字母,当然选择剩下的容纳最小的字母。然后想怎么构造两边,假如最小的字母还有剩,那么肯定放一个在左边,然后假如还有剩,再放一个在右边,continue。否则一定要进行一次修改,为了使得字典序最小,就应该找出现次数是奇数的最大的字母,把他变成最小的字母,然后放进去,continue。
当然写的时候就不需要这么蠢了。用cnt的方法写,注意要跳过奇数次的字母。
char s[200005];
int cnt[128];
void test_case() {
scanf("%s", s + 1);
int n = strlen(s + 1);
for(int i = 1; i <= n; ++i)
++cnt[s[i]];
int l = 'a', r = 'z';
while(l < r) {
if(cnt[l] % 2 == 0) {
++l;
continue;
}
if(cnt[r] % 2 == 0) {
--r;
continue;
}
++cnt[l];
--cnt[r];
++l;
--r;
}
int c = 'a';
for(int i = 1; i <= n / 2; ++i) {
while(cnt[c] < 2)
++c;
s[i] = c;
s[n - i + 1] = c;
cnt[c] -= 2;
}
c = 'a';
if(n % 2 == 1) {
while(cnt[c] == 0)
++c;
s[(n + 1) / 2] = c;
}
puts(s + 1);
}
来源:https://www.cnblogs.com/KisekiPurin2019/p/12460135.html