AtCoder Beginner Contest 163

浪子不回头ぞ 提交于 2020-08-09 21:40:19

比赛链接:https://atcoder.jp/contests/abc163/tasks

A - Circle Pond

题意

由半径输出圆周长。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    double r; cin >> r;
    cout << 2 * 3.14 * r;
}

B - Homework

题意

n 天的假期里要做 m 个任务,最终有多少天假期剩余。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m; cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int t; cin >> t;
        n -= t;
    }
    cout << max(-1, n);
}

C - management

题意

统计 n - 1 个 1~n 的数的个数。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    int cnt[n] = {};
    for (int i = 0; i < n - 1; i++) {
        int t; cin >> t;
        ++cnt[t - 1];
    }
    for (int i : cnt) cout << i << "\n";
}

D - Sum of Large Numbers

题意

从 10100+0、10100+1、10100+2、...、10100+n 中选取 k、k+1、k+2、...、n、n + 1 个数,问所有选取情况中有多少不同的值。

思路

选 i 个数的值个数 = 选 i 个数的最大值 - 选 i 个数的最小值 + 1。

f(n) - f(n - i) 是选后 i 个数,即选 i 个数的最大值,

f(i - 1) 是选前 i 个数,即选 i 个数的最小值,

ans 初始时为 1 是因为选 n + 1 个数只有一种情况。

代码

#include <bits/stdc++.h>
#define f(n) ((n + 1LL) * (n) / 2)
using namespace std;
const int mod = 1e9 + 7;
int main() {
    int n, k; cin >> n >> k;
    int ans = 1;
    for (int i = k; i <= n; i++) 
        ans = (ans + f(n) - f(n - i) - f(i - 1) + 1) % mod;
    cout << ans;
}

E - Active Infants

题意

将一个数组重新排序,每个元素的收益为 值 x 变动距离,问排序后的最大收益。 

思路

先排序,然后从大到小分配元素。

dp[i][j] 表示将 i 个元素分配在左边,j 个元素分配在右边的最大收益。

代码

#include <bits/stdc++.h>
using namespace std;
long long dp[2020][2020];
int main() {
    int n; cin >> n;
    int a[n]; for (int &i : a) cin >> i;
    int p[n]; iota(p, p + n, 0);
    sort(p, p + n, [&] (int x, int y) {
        return a[x] > a[y];
    });
    for (int i = 0; i < n; i++) {
        for (int j = 0; i + j < n; j++) {
            int k = i + j;
            dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + 1LL * a[p[k]] * abs(p[k] - i));
            dp[i][j + 1] = max(dp[i][j + 1], dp[i][j] + 1LL * a[p[k]] * abs(p[k] - (n - 1 - j)));
        }
    }
    long long ans = 0;
    for (int i = 0; i <= n; i++) 
        ans = max(ans, dp[i][n - i]);
    cout << ans;
}

 

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