Technocup 2019 - Elimination Round 3

题目链接:https://codeforces.com/contest/1032

A - Kitchen Utensils

题意:举办一场宴会,有 \(k\) 个人,每个人都消耗同样份数的餐具,且每份餐具中每种餐具至多一个。宴会结束发现有些餐具被偷了,已知剩下 \(n\) 个餐具,这 \(n\) 个餐具分别是第 \(a_i\) 种餐具。求至少被偷了多少个餐具。

题解:首先把出现最多的餐具找出来,对人数取上整,就是最少的餐具份数。再统计一份餐具最少有几种。

int cnt[105];

void test_case() {
    int n, k;
    scanf("%d%d", &n, &k);
    for(int i = 1, x; i <= n; ++i) {
        scanf("%d", &x);
        ++cnt[x];
    }
    sort(cnt + 1, cnt + 1 + 100, greater());
    int num = (cnt[1] + k - 1) / k * k;
    int siz = 0;
    for(int i = 1; i <= 100; ++i)
        siz += cnt[i] ? 1 : 0;
    printf("%d\n", num * siz - n);
}

B

char s[105];

bool check(int r) {
    int n = strlen(s + 1);
    int c = (n + r - 1) / r;
    if(c > 20)
        return false;
    printf("%d %d\n", r, c);
    int rest = r * c - n;
    int top = 0;
    for(int i = 1; i <= r; ++i) {
        for(int j = 1; j < c; ++j)
            printf("%c", s[++top]);
        if(rest) {
            printf("*\n");
            --rest;
        } else
            printf("%c\n", s[++top]);
    }
    return true;
}

void test_case() {
    scanf("%s", s + 1);
    for(int i = 1; i <= 5; ++i) {
        if(check(i))
            return;
    }
}

C - Playing Piano

随便dp

int a[100005];
bool dp[100005][6];
int pre[100005][6];
 
void test_case() {
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = dp[1][5] = 1;
    for(int i = 2; i <= n; ++i) {
        if(a[i] > a[i - 1]) {
            for(int j = 2; j <= 5; ++j) {
                for(int k = 1; k < j; ++k) {
                    if(dp[i - 1][k]) {
                        dp[i][j] = 1;
                        pre[i][j] = k;
                        break;
                    }
                }
            }
        } else if(a[i] < a[i - 1]) {
            for(int j = 1; j <= 4; ++j) {
                for(int k = j + 1; k <= 5; ++k) {
                    if(dp[i - 1][k]) {
                        dp[i][j] = 1;
                        pre[i][j] = k;
                        break;
                    }
                }
            }
        } else {
            for(int j = 1; j <= 5; ++j) {
                for(int k = 1; k <= 5; ++k) {
                    if(k == j)
                        continue;
                    if(dp[i - 1][k]) {
                        dp[i][j] = 1;
                        pre[i][j] = k;
                        break;
                    }
                }
            }
        }
        /*for(int j = 1; j <= 5; ++j)
            printf("%d", (int)pre[i][j]);
        puts("");*/
    }
    for(int j = 1; j <= 5; ++j) {
        if(dp[n][j] == 1) {
            int cur = j;
            for(int i = n; i >= 1; --i) {
                a[i] = cur;
                cur = pre[i][cur];
            }
            for(int i = 1; i <= n; ++i)
                printf("%d%c", a[i], " \n"[i == n]);
            return;
        }
    }
    puts("-1");
    return;
}

你可能感兴趣的:(Technocup 2019 - Elimination Round 3)