比赛链接:https://codeforces.com/contest/1492

1492A.Three swimmers

题意:

有三名游泳的人,他们分别需要 Codeforces Round #704 (Div. 2) A~E - 图1 分钟才能在一个游泳池游一个来回,第一个游泳者将在开始时间 Codeforces Round #704 (Div. 2) A~E - 图2 分钟后在游泳池的左侧,第二个游泳者将在 Codeforces Round #704 (Div. 2) A~E - 图3 分钟后,第三个将在 Codeforces Round #704 (Div. 2) A~E - 图4 分钟后出现在池的左侧。
Codeforces Round #704 (Div. 2) A~E - 图5 分钟后最少需要等待多长时间会有一个游泳者到达游泳池左侧。

思路:

签到题,

可以暴力遍历 Codeforces Round #704 (Div. 2) A~E - 图6 寻找最小值,

也可以直接找 Codeforces Round #704 (Div. 2) A~E - 图7 的倍数离 Codeforces Round #704 (Div. 2) A~E - 图8 差多少

注意开 long long….

【AC Code】

  1. int main() {
  2. ios::sync_with_stdio(false), cin.tie(nullptr);
  3. int _; for (cin >> _; _--;) {
  4. ll p, a, b, c;
  5. cin >> p >> a >> b >> c;
  6. if (p % a == 0 || p % b == 0 || p % c == 0)
  7. cout << "0\n";
  8. else cout << min(a - p % a, min(b - p % b, c - p % c)) << "\n";
  9. }
  10. }

1492B. Card Deck

题意:

Codeforces Round #704 (Div. 2) A~E - 图9 张卡,每张卡的值 Codeforces Round #704 (Div. 2) A~E - 图10,等于 Codeforces Round #704 (Div. 2) A~E - 图11Codeforces Round #704 (Div. 2) A~E - 图12 代表底卡,Codeforces Round #704 (Div. 2) A~E - 图13 是顶卡,在每个步骤中,选择一些 Codeforces Round #704 (Div. 2) A~E - 图14 的整数,从原始卡片组中取出前 Codeforces Round #704 (Div. 2) A~E - 图15 张卡片,然后按它们现在的顺序将它们放置在新卡片组的顶部。让阶数最大。

思路:

找最大的数输出最大的数加后边的所有数,接着找第二个······注意不要重复输出

【AC Code】

  1. const int N = 1e5 + 10;
  2. ll a[N], pos[N];
  3. bool st[N];
  4. int main() {
  5. ios::sync_with_stdio(false), cin.tie(nullptr);
  6. int _; for (cin >> _; _--;) {
  7. vector<int>A;
  8. int n; cin >> n;
  9. for (int i = 1; i <= n; ++i) {
  10. cin >> a[i];
  11. pos[i] = i;
  12. st[a[i]] = 0;
  13. }
  14. ll t = n;
  15. for (ll i = n; i >= 1; i -= 1) {
  16. if (a[i] == t)
  17. for (ll j = i; !st[a[j]] && j <= n; j += 1) {
  18. st[a[j]] = 1;
  19. A.emplace_back(a[j]);
  20. }
  21. while (st[t] && t >= 1) t -= 1;
  22. }
  23. for (ll i = 0; i < n; i += 1) cout << A[i] << " \n"[i == n - 1];
  24. }
  25. }

1492C. Maximum width

题意:

给你两个字符串 Codeforces Round #704 (Div. 2) A~E - 图16Codeforces Round #704 (Div. 2) A~E - 图17 串和 Codeforces Round #704 (Div. 2) A~E - 图18 串匹配的下标,然后找相邻下标之间的最大值,管你懂不懂看样例就完事了

思路:

看了半天样例发现只需要前后扫一遍,分别用两个数组去存前后扫的下标结果,取两个数组相邻位置的最大值

【AC Code】

  1. const int N = 2e5 + 10;
  2. int n, m, a[N], b[N];
  3. string s, t;
  4. int main() {
  5. ios::sync_with_stdio(false), cin.tie(nullptr);
  6. cin >> n >> m >> s >> t;
  7. int i = 0, j = 0;
  8. while (j < m) {
  9. if (s[i] == t[j]) {
  10. a[j] = i + 1;
  11. i ++; j ++;
  12. } else i ++;
  13. }
  14. i = n - 1, j = m - 1;
  15. while (j > 0) {
  16. if (s[i] == t[j]) {
  17. b[j] = i + 1;
  18. i --; j --;
  19. } else i --;
  20. }
  21. int ans = 0;
  22. for (int q = 0; q < m; q ++)
  23. ans = max(ans, b[q + 1] - a[q]);
  24. cout << ans << "\n";
  25. }

1492D. Genius’s Gambit

题意:

给你三个数,Codeforces Round #704 (Div. 2) A~E - 图19 代表 Codeforces Round #704 (Div. 2) A~E - 图20 的个数,Codeforces Round #704 (Div. 2) A~E - 图21 代表 Codeforces Round #704 (Div. 2) A~E - 图22 的个数,Codeforces Round #704 (Div. 2) A~E - 图23 代表 Codeforces Round #704 (Div. 2) A~E - 图24Codeforces Round #704 (Div. 2) A~E - 图25 的个数,让你求出 Codeforces Round #704 (Div. 2) A~E - 图26 满足 Codeforces Round #704 (Div. 2) A~E - 图27 三个条件,如果没有输出 NO

思路:

构造题,说实话赛时没构造出来,这里参考了一下题解

由题目可知 Codeforces Round #704 (Div. 2) A~E - 图28 是肯定的,所以我们不妨假设 Codeforces Round #704 (Div. 2) A~E - 图29 ,然后对 Codeforces Round #704 (Div. 2) A~E - 图30 进行变换,我们发现 Codeforces Round #704 (Div. 2) A~E - 图31 最右边的1往后移动一位 Codeforces Round #704 (Div. 2) A~E - 图32 的值就多一个 Codeforces Round #704 (Div. 2) A~E - 图33 ,最大为 Codeforces Round #704 (Div. 2) A~E - 图34 ,然后移动倒数第二个 Codeforces Round #704 (Div. 2) A~E - 图35 ,发现只能移动一次,如果移动两次不会多一个 Codeforces Round #704 (Div. 2) A~E - 图36

假设
x 1110000
y 1110000

Codeforces Round #704 (Div. 2) A~E - 图37 的倒数第一个 Codeforces Round #704 (Div. 2) A~E - 图38 往右移动时发现 Codeforces Round #704 (Div. 2) A~E - 图39Codeforces Round #704 (Div. 2) A~E - 图40 的个数 Codeforces Round #704 (Div. 2) A~E - 图41 ,当y 1100001时 Codeforces Round #704 (Div. 2) A~E - 图42Codeforces Round #704 (Div. 2) A~E - 图43 的个数为 Codeforces Round #704 (Div. 2) A~E - 图44 ,然后移动倒数第二个 Codeforces Round #704 (Div. 2) A~E - 图45,移动一次,发现 Codeforces Round #704 (Div. 2) A~E - 图46Codeforces Round #704 (Div. 2) A~E - 图47 的个数变成了 Codeforces Round #704 (Div. 2) A~E - 图48 ,再移动一次发现又变回 Codeforces Round #704 (Div. 2) A~E - 图49 ,所以除了倒数第一个 Codeforces Round #704 (Div. 2) A~E - 图50 可以移动多次,第一个 Codeforces Round #704 (Div. 2) A~E - 图51 不能移动中间的 Codeforces Round #704 (Div. 2) A~E - 图52 只能移动一次,我们可以找出规律,最大的值为 Codeforces Round #704 (Div. 2) A~E - 图53

【AC Code】

  1. int a, b, k;
  2. int main(void) {
  3. cin.tie(0);
  4. ios::sync_with_stdio(false);
  5. cin >> a >> b >> k;
  6. if (k == 0) {
  7. cout << "Yes" << '\n';
  8. string x = "", y = "";
  9. x += '1';
  10. b--;
  11. for (int i = 0; i < a; i++) x += '0';
  12. for (int i = 0; i < b; i++) x += '1';
  13. cout << x << '\n';
  14. cout << x << '\n';
  15. return 0;
  16. }
  17. k--;
  18. if (a > 0 && b >= 2 && (a + b - 3 >= k)) {
  19. cout << "Yes" << '\n';
  20. string x = "";
  21. string y = "";
  22. a--; b -= 2;
  23. x += '1'; y += '1';
  24. x += '1'; y += '0';
  25. for (int i = 0; i < k; i++) {
  26. if (a) {
  27. a--;
  28. x += '0'; y += '0';
  29. } else {
  30. b--;
  31. x += '1'; y += '1';
  32. }
  33. }
  34. x += '0'; y += '1';
  35. while (a--) {
  36. x += '0'; y += '0';
  37. }
  38. while (b--) {
  39. x += '1'; y += '1';
  40. }
  41. cout << x << '\n';
  42. cout << y << '\n';
  43. } else
  44. cout << "No" << '\n';
  45. }

模拟构造,我不会(QAQ

1492E. Almost Fault-Tolerant Database

题意:

给定 Codeforces Round #704 (Div. 2) A~E - 图54 个长度为 Codeforces Round #704 (Div. 2) A~E - 图55 的数组,需要输出一个长度为 Codeforces Round #704 (Div. 2) A~E - 图56 的数组,使得这些数组之间不同的数不超过两个,输出YES,输出你构造的数组,若有多种情况,可任意输出一种。如若不存在,输出NO。

思路:

假设第一个数组为标准数组,遍历

  1. 不同数小于等于 Codeforces Round #704 (Div. 2) A~E - 图57,没问题
  2. 不同数大于 Codeforces Round #704 (Div. 2) A~E - 图58 ,直接输出NO
  3. 就是 Codeforces Round #704 (Div. 2) A~E - 图59 的情况,我们找差异数最大的那个也就是 Codeforces Round #704 (Div. 2) A~E - 图60 的情况,枚举修改的两个位置,判断是否可以成立。

【AC Code】

  1. const int N = 250010;
  2. int n, m;
  3. vector <int> s[N];
  4. bool check2(vector<int> &v) {
  5. for (int i = 1; i < n; i ++) {
  6. int cnt = 0;
  7. for (int j = 0; j < m; j ++)
  8. if (s[i][j] != v[j]) cnt ++;
  9. if (cnt > 3) return false;
  10. else if (cnt == 3) {
  11. int ans = 1;
  12. for (int j = 0; j < m; j ++) {
  13. if (s[i][j] != v[j] && v[j] == -1) {
  14. ans = 0;
  15. v[j] = s[i][j];
  16. break;
  17. }
  18. }
  19. if (ans) return false;
  20. }
  21. }
  22. return true;
  23. }
  24. bool check() {
  25. int cnt = 0, ax = 0, id;
  26. for (int i = 1; i < n; i ++) {
  27. int ans = 0;
  28. for (int j = 0; j < m; j ++)
  29. if (s[i][j] != s[0][j]) ans ++;
  30. if (ans > 4) return false;
  31. if (ans <= 2) cnt ++;
  32. if (ans > ax)ax = ans, id = i;
  33. }
  34. if (cnt == n - 1) {
  35. cout << "Yes\n";
  36. for (int i = 0; i < m; ++i) cout << s[0][i] << " \n"[i == m - 1];
  37. return true;
  38. }
  39. vector<int> a;
  40. for (int i = 0; i < m; i ++)
  41. if (s[0][i] != s[id][i]) a.push_back(i);
  42. for (int i = 0; i < a.size(); i ++) {
  43. for (int j = 0; j < a.size(); j ++) {
  44. if (i == j) continue;
  45. vector<int> b = s[0];
  46. b[a[i]] = s[id][a[i]];
  47. b[a[j]] = -1;
  48. if (check2(b)) {
  49. cout << "Yes\n";
  50. for (int i = 0; i < m; ++i) cout << (b[i] == -1 ? s[0][i] : b[i]) << " \n"[i == m - 1];
  51. return true;
  52. }
  53. }
  54. }
  55. return false;
  56. }
  57. int main() {
  58. ios::sync_with_stdio(false), cin.tie(nullptr);
  59. cin >> n >> m;
  60. for (int i = 0; i < n; i ++) {
  61. for (int j = 0, x; j < m; j ++) {
  62. cin >> x;
  63. s[i].push_back(x);
  64. }
  65. }
  66. if (!check()) puts("No");
  67. }