题目链接: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