AtCoder Beginner Contest 099

A - ABD

大意:

输入1-999就输出ABC,否则输出ABD

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int n;
int main(){
    cin >> n;
    if (n >= 1000) cout << "ABD" << endl;
    else
        cout << "ABC" << endl;
    return 0;
}

B - Stone Monument

大意:

从左到右有999个塔,塔高分别为1 1+2 1+2+3 1+2+3+4.....

现在因为积雪,使得相邻两个塔的塔高变为了a和b,问积雪有多高

思路:

b-a代表b是第几个塔,算一下原来是多少,现在是多少,相减即可

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int a, b, sum[N];
int main() {
    for (int i = 1; i <= 999; i++) {
        sum[i] += sum[i - 1] + i;
    }
    cin >> a >> b;
    cout << sum[b - a - 1] - a;
    return 0;
}

C - Strange Bank

大意:

给出金额n,现在一次取钱只能取出1块钱或者是6或9的幂次块钱,问最少需要取多少才能正好取出n块钱

思路:

完全背包dp即可

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int n, s6[N], s9[N], dp[N];
int main() {
    s6[1] = 6, s9[1] = 9;
    for (int i = 2; i <= 9; i++) {
        s6[i] = s6[i - 1] * 6;
        s9[i] = s9[i - 1] * 9;
    }
    cin >> n;
    for (int i = 0; i <= n; i++) {
        dp[i] = i;
    }
    for (int i = 1; i <= 9; i++) {
        for (int j = s6[i]; j <= n; j ++) {
            dp[j] = min(dp[j], dp[j - s6[i]] + 1);
        }
    }

    for (int i = 1; i <= 9; i++) {
        for (int j = s9[i]; j <= n; j ++) {
            dp[j] = min(dp[j], dp[j - s9[i]] + 1);
        }
    }
    int res = 0x3f3f3f3f;
    for (int i = 0; i <= n; i++) {
        res = min(n - i + dp[i], res);
    }
    cout << res << endl;
    return 0;
}

D - Good Grid

大意:

给出一个nxn的矩阵,每个位置都涂着1-c之间任意一种颜色,从颜色i变为颜色j需要花费(D_{i,j}),现在要求横坐标+纵坐标的和模3相同的位置颜色必须相同,不同的位置颜色必须不同,最少的代价是多少

c<=30

思路:

因为颜色种类比较少,所以可以先统计对3取模的位置用各个颜色多少次,然后枚举对3取模的位置取什么颜色,计算花费即可,这样复杂度为(30^3)

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int n, c, C[505][505], D[35][35], num[3][35];
int main() {
    cin >> n >> c;
    for (int i = 1; i <= c; i++) {
        for (int j = 1; j <= c; j++) {
            cin >> D[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> C[i][j];
            num[(i + j) % 3][C[i][j]]++;
        }
    }
    int res = 0x3f3f3f3f;
    for (int i = 1; i <= c; i++) {
        int sum1 = 0;
        for (int j = 1; j <= c; j++) {
            sum1 += num[0][j] * D[j][i];
        }
        for (int j = 1; j <= c; j++) {
            if (i == j) continue;
            int sum2 = 0;
            for (int k = 1; k <= c; k++) {
                sum2 += num[1][k] * D[k][j];
            }
            for (int k = 1; k <= c; k++) {
                if (k == j||k==i) continue;
                int sum3 = 0;
                for (int l = 1; l <= c; l++) {
                    sum3 += num[2][l] * D[l][k];
                }
                res = min(res, sum1 + sum2 + sum3);
            }
        }
    }
    cout << res << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/14360317.html