Educational Codeforces Round 2

天涯浪子 提交于 2020-03-11 05:31:11

题目链接: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);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!