Codeforces Round #603 (Div. 2)

﹥>﹥吖頭↗ 提交于 2019-12-06 03:53:06

A - Sweet Problem

题意:有3种糖果(什么蜡烛?分不清candy和candle的一定不止我一个中国人),每天要吃两种不同的各1颗。给出3种的数量,求可以吃多少天。

题解:假如数据小的话直接每次去最高的两个--,然后sort就行了。可惜搞不得。但是每次取最高这个思路是没错的。假如三种数量很平均,那么肯定是加起来除以2的下整,不对的情况在于最多的糖不能充分利用,临界情况是恰好相等,所以:

void test_case() {
    int a[4];
    for(int i = 1; i <= 3; ++i)
        scanf("%d", &a[i]);
    sort(a + 1, a + 1 + 3);
    a[3] = min(a[3], a[1] + a[2]);
    printf("%d\n", (a[1] + a[2] + a[3]) / 2);
}

B - PIN Codes

题意:有n(<=10)种PIN码,PIN码就是4位可前导零的数字,每次可以改动一位数字,求使得所有PIN码两两不同的最小改法。

题解:因为一共就10种码,刚好有10种数字,所以无论如何都最多改1位就够了。每次取重复的两个出来,然后遍历其中的数字,枚举把它改成谁会和大家都不一样。注意最后还要输出前后对应的关系。

map<string, int> m;
string a[15];

void test_case() {
    m.clear();
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i) {
        cin >> a[i];
        m[a[i]]++;
    }
    int ans = 0;
    while(m.size() < n) {
        string id;
        for(auto i : m) {
            if(i.second >= 2) {
                id = i.first;
                break;
            }
        }
        ++ans;
        for(int j = 0; j <= 9; ++j) {
            if(id[0] == ('0' + j))
                continue;
            string tmp = id;
            tmp[0] = char('0' + j);
            if(m.count(tmp))
                continue;
            else {
                m[tmp]++;
                m[id]--;
                for(int k = 1; k <= n; ++k) {
                    if(a[k] == id) {
                        a[k] = tmp;
                        break;
                    }
                }
                break;
            }
        }

    }
    cout << ans << endl;
    for(int i = 1; i <= n; ++i)
        cout << a[i] << endl;
}

C - Everyone is a Winner!

题意:数论分块

注意:数论分块的复杂度是 \(\lceil2\*\sqrt{n}\rceil\) ,搞不清楚就弄个vec或者开大很多或者输出出来看一下。还有就是1e9的根号是3.2e4。

int a[64005];

void test_case() {
    int n, atop = 0;
    scanf("%d", &n);
    for(int l = 1, r; l <= n; l = r + 1) {
        r = n / (n / l);
        a[++atop] = n / l;
    }
    a[++atop] = 0;
    reverse(a + 1, a + 1 + atop);
    printf("%d\n", atop);
    for(int i = 1; i <= atop; ++i)
        printf("%d%c", a[i], " \n"[i == atop]);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!