比赛链接:Here

1315A. Dead Pixel

签到题,

比较四个值

max(max(x, a - 1 - x) * b, a * max(y, b - 1 - y))

1315B. Homecoming

Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图1 花费 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图2

Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图3 花费 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图4

求要走到点 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图5,从 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图6 上车能在 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图7 内到终点。


这个挺多解法的

  • 二分答案
  • 逆推模拟
  • DP

虚拟赛的时候写了DP

  1. const int N = 1e6 + 10;
  2. ll f[N];
  3. int main() {
  4. cin.tie(nullptr)->sync_with_stdio(false);
  5. int _; for (cin >> _; _--;) {
  6. int a, b, p; cin >> a >> b >> p;
  7. string s; cin >> s;
  8. int n = s.size();
  9. if (s[n - 1] == 'A') f[n - 1] = a;
  10. else f[n - 1] = b;
  11. f[n] = 0;
  12. ll pos = n - 1;
  13. for (int i = n - 2; i >= 0; --i) {
  14. if (i == n - 2) f[i] = (s[i] == 'A' ? a : b);
  15. else if (s[i] == s[i + 1]) f[i] = f[i + 1];
  16. else f[i] = f[i + 1] + (s[i] == 'A' ? a : b);
  17. }
  18. for (int i = 0; i < n; ++i)
  19. if (f[i] <= p) {pos = i; break;}
  20. cout << pos + 1 << "\n";
  21. }
  22. }

1315C. Restoring Permutation

题意:

给一组长度为 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图8Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图9 , 让你找一组长度为 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图10Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图11 , 满足 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图12#card=math&code=b%5Bi%5D%20%3D%20min%28a%5B2%2Ai-1%20%5D%20%2Ca%5B2%2Ai%5D%29) ,并且字典序最小 。


AtCoder 上做过类似的,直接考虑贪心

  1. const int N = 1e4 + 10;
  2. ll a[N], b[N];
  3. int main() {
  4. cin.tie(nullptr)->sync_with_stdio(false);
  5. int _; for (cin >> _; _--;) {
  6. ll n;
  7. cin >> n;
  8. map<ll, ll> mp;
  9. for (int i = 1; i <= n; ++i) {
  10. cin >> b[i], mp[b[i]] = 1;
  11. }
  12. bool f = 1;
  13. for (int i = 1;f and i <= n; ++i) {
  14. a[i * 2 - 1] = b[i];
  15. ll k = b[i];
  16. while (mp[k] == 1) k += 1;
  17. if (k <= 2 * n) {
  18. a[i * 2] = k;
  19. mp[k] = 1;
  20. } else f = 0;
  21. }
  22. if (!f) cout << "-1\n";
  23. else
  24. for (int i = 1; i <= 2 * n; ++i)cout << a[i] << " \n"[i == 2 * n];
  25. }
  26. }

1315D. Recommendations

题意:
你有 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图13 本书,每本书的数量为 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图14 ,你可以花费 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图15 让这对应的书加 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图16 ,求总花费最小并使得 Codeforces Round #623 (Div. 2) A~D题,D题multiset使用 - 图17 各不相同。

利用容器 multiset

每次把同样数量的书放入一个 multiset 里,然后把最大的书拿出来保留,其他的书花费的时间加到答案里,再把 +1 之后书放进去,再反复操作。

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int n; cin >> n;
  4. vector<pair<int, int>> v(n);
  5. for (int i = 0; i < n; ++i) cin >> v[i].first;
  6. for (int i = 0; i < n; ++i) cin >> v[i].second;
  7. multiset<int>ms;
  8. sort(v.begin(), v.end());
  9. int c = 1, i = 0;
  10. ll s = 0, r = 0;
  11. while (1) {
  12. if (ms.size() == 0 && i == n) {
  13. cout << r;
  14. return 0;
  15. }
  16. if (ms.size() == 0) c = v[i].first;
  17. for (; i < n && v[i].first == c; ++i) {
  18. ms.insert(-v[i].second);
  19. s += v[i].second;
  20. }
  21. s += *ms.begin();
  22. ms.erase(ms.begin());
  23. r += s, c++;
  24. }
  25. }