1443A. Kids Seating

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图1

题意: 给你一个整数n,现在你需要从编号 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图2 ~ $4 ⋅ n Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图3nCodeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图4g c d ≠ 1$ ,不能整除。

看了半天,发现只要满足 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图5 即可

  1. void solve() {
  2. cin >> n;
  3. for (int i = 2 * n + 2; i <= 4 * n; i += 2) cout << i << " ";
  4. cout << endl;
  5. }
  1. for _ in range(int(input())):
  2. n = int(input())
  3. print(*[2*i+2*n+2 for i in range(n)])

1443B. Saving the City

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图6

题意:

现在城市中有一些炸弹,但我们的拆弹专家知道如何引爆炸弹而不影响建筑(引爆时会使整个连续区间的炸弹都爆炸)。引爆一次炸弹需要 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图7 花费,而添加一个炸弹需要 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图8 花费。问怎么做才能使消费最小

思路:

由于任何地雷的激活都会炸毁整个地雷段,因此您可以立即用一系列地雷段替换输入字符串。 现在,我们有两个操作。 我们可以用硬币删除任何分段,或者将两个相邻的分段 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图9#card=math&code=%5Bl1%EF%BC%8Cr1%5D%EF%BC%8C%5Bl2%EF%BC%8Cr2%5D%20%28r1%20%3Cl2%29)变成 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图10#card=math&code=b%E2%8B%85%28l2-r1%29)的分段。 即,可以以 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图11Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图12#card=math&code=a%20%2Bb%E2%8B%85%28l2-r1%29) 的代价删除两个片段。 这意味着您需要在 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图13%E2%89%A4a#card=math&code=b%E2%8B%85%28l2-r1%29%E2%89%A4a) 时合并两个段。 所以想到取到最小花费只需要遍历所有相邻的路段并检查这种情况。

  1. void solve() {
  2. int a, b; cin >> a >> b;
  3. string s; cin >> s;
  4. int i = 0, len = s.length();
  5. vector<pair<int, int>> v;
  6. while (i < len) {
  7. while (i < len && s[i] == '0') i++;
  8. int j = i;
  9. while (j < len && s[j] == '1') j++;
  10. if (i < len) v.push_back({i, j});
  11. i = j;
  12. }
  13. if (v.size() == 0)
  14. printf("0\n");
  15. else {
  16. int ans = a;
  17. for (int i = 1; i < v.size(); i++) {
  18. ans += min((v[i].first - v[i - 1].second) * b, a);
  19. }
  20. printf("%d\n", ans);
  21. }
  22. }

1443C. The Delivery Dilemma

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图14

题意:

你需要点Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图15个不同的菜,你有两种方式可以选择,一种是点外卖,花费Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图16 时间,一种是自己拿,花费Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图17 时间。你需要在最少的时间中弄完这Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图18 个菜。

思路:

因为选择点外卖一直是需要人在家的(等价于点外卖一定是最大时间),那么根据贪心思想只需要统计自己拿的时间总和(此时需要自定义排序)

  1. // Author : RioTian
  2. // Time : 20/11/03
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn = 2e5 + 10;
  7. struct node {
  8. int x, y;
  9. } a[maxn];
  10. bool cmp(node a, node b) { return a.x < b.x; }
  11. ll _, n;
  12. void solve() {
  13. cin >> n;
  14. for (int i = 1; i <= n; ++i) cin >> a[i].x;
  15. for (int i = 1; i <= n; ++i) cin >> a[i].y;
  16. sort(a + 1, a + 1 + n, cmp);
  17. int now = n, sum = 0;
  18. while (now >= 1) {
  19. if (a[now].x > sum + a[now].y) {
  20. sum += a[now].y;
  21. now--;
  22. } else
  23. break;
  24. }
  25. cout << max(a[now].x, sum) << '\n';
  26. }
  27. int main() {
  28. // freopen("in.txt", "r", stdin);
  29. ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  30. cin >> _;
  31. while (_--) solve();
  32. }

1443D. Extreme Subtraction

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图19

思路:(来自比赛提示)

问题看起来像是-检查是否有递增和递减的数组,它们在元素上的总和等于给定的数组。
这个问题可以贪婪地解决。 让我们最大化递减数组的每个元素(我们称此数组为a,递增数组为b)。 假设初始数组为v,我们已经解决了长度为Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图20的前缀的问题。 然后,对于元素a [i],必须满足Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图21Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图22。 重写第二个不等式并与第一个不等式组合,我们得到Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图23。 显然,通过构造最好采用Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 个人题解(A - D) - 图24

  1. void solve() {
  2. int n;
  3. cin >> n;
  4. vector<int> arr(n), last(n);
  5. int rem = 0;
  6. for (int i = 0; i < n; i++) {
  7. cin >> arr[i];
  8. }
  9. int l = arr[0], r = 0;
  10. for (int i = 1; i < n; i++) {
  11. if (r > arr[i]) {
  12. cout << "NO\n";
  13. return;
  14. }
  15. if (l + r < arr[i]) {
  16. r = arr[i] - l;
  17. } else {
  18. l = arr[i] - r;
  19. }
  20. }
  21. cout << "YES\n";
  22. }

E、F表示没怎么看懂题,待补状态。。。