Three Friends

\[Time Limit: 1 s\quad Memory Limit: 256 MB
\]

根据题意,把最大的减一,最小的加一,然后答案就是两倍他们的差值

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. int main() {
  38. scanf("%d", &T);
  39. while(T--) {
  40. ll a, b, c;
  41. scanf("%lld%lld%lld", &a, &b, &c);
  42. ll x = min({a, b, c});
  43. ll y = max({a, b, c});
  44. ll ans = y-x-2;
  45. printf("%lld\n", max(0ll, ans*2));
  46. }
  47. return 0;
  48. }

Snow Walking Robot

\[Time Limit: 2 s\quad Memory Limit: 256 MB
\]

考虑放成长方形,那么 \(L、R\) 方向能放的个数就是 \(L、R\) 的较少值,\(U、D\) 方向能放的个数就是 \(U、D\) 方向的较少值。

特殊考虑一下存在 \(L、R\) 为 \(0\) 个,或 \(U、D\) 为 \(0\) 个的方案就可以了,

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. int a[5];
  38. char ch[4];
  39. char s[maxn], ans[maxn];
  40. int getid(char x) {
  41. if(x == 'L') return 0;
  42. if(x == 'R') return 1;
  43. if(x == 'U') return 2;
  44. if(x == 'D') return 3;
  45. }
  46. void solve() {
  47. tol = 0;
  48. if(a[0]==0 || a[1]==0) {
  49. if(a[2]>0 && a[3]>0) {
  50. ans[++tol] = ch[2];
  51. ans[++tol] = ch[3];
  52. }
  53. return ;
  54. }
  55. if(a[2]==0 || a[3]==0) {
  56. if(a[0]>0 && a[1]>0) {
  57. ans[++tol] = ch[0];
  58. ans[++tol] = ch[1];
  59. }
  60. return ;
  61. }
  62. int mx = 0;
  63. for(int i=1; i<=3; i++) {
  64. if(a[i] > a[mx]) mx = i;
  65. }
  66. char f1 = ch[mx^1], f3 = ch[mx];
  67. int c1 = a[mx^1];
  68. a[mx] = a[mx^1] = 0;
  69. mx = 0;
  70. for(int i=1; i<=3; i++) {
  71. if(a[i] > a[mx]) mx = i;
  72. }
  73. char f2 = ch[mx^1], f4 = ch[mx];
  74. int c2 = a[mx^1];
  75. for(int i=1; i<=c1; i++) ans[++tol] = f1;
  76. for(int i=1; i<=c2; i++) ans[++tol] = f2;
  77. for(int i=1; i<=c1; i++) ans[++tol] = f3;
  78. for(int i=1; i<=c2; i++) ans[++tol] = f4;
  79. }
  80. int main() {
  81. ch[0] = 'L';
  82. ch[1] = 'R';
  83. ch[2] = 'U';
  84. ch[3] = 'D';
  85. scanf("%d", &T);
  86. while(T--) {
  87. mes(a, 0);
  88. scanf("%s", s+1);
  89. n = strlen(s+1);
  90. for(int i=1; i<=n; i++) a[getid(s[i])]++;
  91. solve();
  92. ans[++tol] = '\0';
  93. tol--;
  94. printf("%d\n", tol);
  95. printf("%s\n", ans+1);
  96. }
  97. return 0;
  98. }

Yet Another Broken Keyboard

\[Time Limit: 2 s\quad Memory Limit: 256 MB
\]

直接根据题目模拟,令连续可用字符的个数 \(x\),答案就是所有的 \(\frac{x(x+1)}{2}\) 之和。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. char s[maxn];
  38. bool vis[222];
  39. int main() {
  40. scanf("%d%d", &n, &m);
  41. mes(vis, 0);
  42. scanf("%s", s+1);
  43. s[n+1] = 'z'+1;
  44. for(int i=1; i<=m; i++) {
  45. char x[5];scanf("%s", x+1);
  46. vis[x[1]-'a'+1] = 1;
  47. }
  48. ll ans = 0, cnt = 0;
  49. for(int i=1; i<=n+1; i++) {
  50. if(vis[s[i]-'a'+1]) {
  51. cnt++;
  52. continue;
  53. }
  54. ans += (cnt+1)*cnt/2;
  55. cnt = 0;
  56. }
  57. printf("%lld\n", ans);
  58. return 0;
  59. }

Remove One Element

\[Time Limit: 2 s\quad Memory Limit: 256 MB
\]

  1. 令数组 \(b[]\) 表示以 \(i\) 结尾,往左最多可以取多少个数字
  2. 令数组 \(c[]\) 表示以 \(i\) 开头,往右最多可以取多少个数字

假设不用删除元素,那么 \(b[]\) 中的最大值就是一个答案。

考虑删掉一个元素,也就是把 \(a[i-1]\) 和 \(a[i+1]\) 合在了一起,那么就考虑 \(a[i-1]\) 和 \(a[i+1]\) 是否满足递增。如果满足递增的话,就会产生新的合法序列,其长度就是 \(b[i-1]+c[i+1]\)。

那么只要枚举删掉的元素是哪个,就可以计算答案了。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. ll a[maxn], b[maxn], c[maxn];
  38. int main() {
  39. scanf("%d", &n);
  40. b[0] = b[n+1] = 0;
  41. c[0] = c[n+1] = 0;
  42. ll ans = 0;
  43. for(int i=1; i<=n; i++) {
  44. scanf("%lld", &a[i]);
  45. b[i] = a[i]>a[i-1] ? b[i-1]+1 : 1;
  46. ans = max(ans, b[i]);
  47. }
  48. for(int i=n; i>=1; i--) {
  49. c[i] = a[i]<a[i+1] ? c[i+1]+1 : 1;
  50. ans = max(ans, c[i]);
  51. }
  52. for(int i=1; i<=n; i++) {
  53. if(i==1 || i==n || a[i+1]>a[i-1])
  54. ans = max(ans, b[i-1]+c[i+1]);
  55. }
  56. printf("%lld\n", ans);
  57. return 0;
  58. }

Nearest Opposite Parity

\[Time Limit: 2 s\quad Memory Limit: 256 MB
\]

令 \(dp[maxn][0/1]\) 表示从 \(i\) 位置到最近的 偶数/奇数 需要跳的最小步数。

反向建图,例如从 \(i\) 跳到 \(j\),那么连一条 \(j\) 到 \(i\) 的边

初始时 \(dp[i][a[i]\%2]=0\),然后暴力 \(bfs\) 就可以算出每个状态,如果结束后还有哪个状态没有计算出来,那就是无法到达。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. int a[maxn], c[maxn];
  38. ll dp[maxn][2];
  39. vector<int> vv[maxn];
  40. struct Node {
  41. int p, st, step;
  42. };
  43. int main() {
  44. queue<Node> q;
  45. scanf("%d", &n);
  46. for(int i=1; i<=n; i++) {
  47. scanf("%d", &a[i]);
  48. c[i] = a[i]%2;
  49. dp[i][0] = dp[i][1] = -1;
  50. if(i-a[i]>=1) vv[i-a[i]].pb(i);
  51. if(i+a[i]<=n) vv[i+a[i]].pb(i);
  52. q.push({i, c[i], 0});
  53. }
  54. while(!q.empty()) {
  55. Node now = q.front();
  56. q.pop();
  57. if(dp[now.p][now.st] != -1) continue;
  58. dp[now.p][now.st] = now.step;
  59. for(auto np : vv[now.p]) {
  60. q.push({np, now.st, now.step+1});
  61. }
  62. }
  63. for(int i=1; i<=n; i++) printf("%lld%c", dp[i][!c[i]], i==n ? '\n':' ');
  64. return 0;
  65. }

Two Bracket Sequences

\[Time Limit: 2 s\quad Memory Limit: 256 MB
\]

考虑判断括号表达式是否合法的过程,整个栈中只会有 \((\),如果空栈时遇到一个 \()\) 就必然是不合法的。

如果全部字符串判断结束后栈中还有 \((\),那么想要让他变成合法的式子,只要补上相应多的 \()\) 就可以了。

因为要满足两个字符串都是构造出来的字符串的子序列,那么必然是可以贪心去判断是否是它的子序列的。

令 \(dp[i][j][k]\) 表示第一个字符串贪心到第 \(i\) 位,第二个字符串贪心匹配到第 \(j\) 位,栈中还有 \(k\) 个 \((\) 所需要的最少步数。

\(dp\) 的过程中,在保证满足 \(k\) 够的情况下,每次尝试在后面放一个 \((\) 或 \()\),看放入的这个括号对整个 \(dp\) 状态的改变。

那么最后的合法状态就是 \(dp[n][m][k]\) 形成的字符串在加上 \(k\) 个 \()\)。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e2 + 10;
  28. const int maxm = 4e2 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. struct Node {
  38. int x, y, z;
  39. } last[maxn][maxn][maxm];
  40. int dp[maxn][maxn][maxm];
  41. char s1[maxn], s2[maxn];
  42. int main() {
  43. scanf("%s%s", s1+1, s2+1);
  44. n = strlen(s1+1);
  45. m = strlen(s2+1);
  46. tol = 0;
  47. for(int i=1; i<=n; i++) tol += s1[i]=='(';
  48. for(int i=1; i<=m; i++) tol += s2[i]=='(';
  49. tol = max(tol, n+m-tol);
  50. mes(dp, inf);
  51. dp[0][0][0] = 0;
  52. for(int i=0; i<=n; i++) {
  53. for(int j=0; j<=m; j++) {
  54. for(int k=0; k<=tol; k++) {
  55. if(dp[i][j][k] == inf) continue;
  56. // printf("dp[%d][%d][%d] = %d\n", i, j, k, dp[i][j][k]);
  57. if(s1[i+1] == '(' && s2[j+1] == '(') {
  58. if(dp[i+1][j+1][k+1] > dp[i][j][k]+1) {
  59. dp[i+1][j+1][k+1] = dp[i][j][k]+1;
  60. last[i+1][j+1][k+1] = {i, j, k};
  61. }
  62. } else if(s1[i+1] == '(') {
  63. if(dp[i+1][j][k+1] > dp[i][j][k]+1) {
  64. dp[i+1][j][k+1] = dp[i][j][k]+1;
  65. last[i+1][j][k+1] = {i, j, k};
  66. }
  67. } else if(s2[j+1] == '(') {
  68. if(dp[i][j+1][k+1] > dp[i][j][k]+1) {
  69. dp[i][j+1][k+1] = dp[i][j][k]+1;
  70. last[i][j+1][k+1] = {i, j, k};
  71. }
  72. } else {
  73. if(dp[i][j][k+1] > dp[i][j][k]+1) {
  74. dp[i][j][k+1] = dp[i][j][k]+1;
  75. last[i][j][k+1] = {i, j, k};
  76. }
  77. }
  78. if(!k) continue;
  79. if(s1[i+1] == ')' && s2[j+1] == ')') {
  80. if(dp[i+1][j+1][k-1] > dp[i][j][k]+1) {
  81. dp[i+1][j+1][k-1] = dp[i][j][k]+1;
  82. last[i+1][j+1][k-1] = {i, j, k};
  83. }
  84. } else if(s1[i+1] == ')') {
  85. if(dp[i+1][j][k-1] > dp[i][j][k]+1) {
  86. dp[i+1][j][k-1] = dp[i][j][k]+1;
  87. last[i+1][j][k-1] = {i, j, k};
  88. }
  89. } else if(s2[j+1] == ')') {
  90. if(dp[i][j+1][k-1] > dp[i][j][k]+1) {
  91. dp[i][j+1][k-1] = dp[i][j][k]+1;
  92. last[i][j+1][k-1] = {i, j, k};
  93. }
  94. } else {
  95. if(dp[i][j][k-1] > dp[i][j][k]+1) {
  96. dp[i][j][k-1] = dp[i][j][k]+1;
  97. last[i][j][k-1] = {i, j, k};
  98. }
  99. }
  100. }
  101. }
  102. }
  103. int id = 0;
  104. for(int i=1; i<=tol; i++) {
  105. if(dp[n][m][id]+id > dp[n][m][i]+i) id = i;
  106. }
  107. vector<char> vv;
  108. Node now = {n, m, id};
  109. for(int i=1; i<=id; i++) vv.push_back(')');
  110. while(now.x || now.y || now.z) {
  111. vv.push_back(now.z > last[now.x][now.y][now.z].z ? '(' : ')');
  112. now = last[now.x][now.y][now.z];
  113. }
  114. for(int i=(int)vv.size()-1; i>=0; i--) putchar(vv[i]);
  115. puts("");
  116. return 0;
  117. }
  118.  

Codeforces Round #605 (Div. 3) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  4. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  7. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  8. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

  9. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

随机推荐

  1. MySQL实战45讲学习笔记:第三十八讲

    一.本节内容 我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值在最后一行:而使用磁盘临时表得到的结果里 ...

  2. VS2017 无法解析的外部符号 __vscwprintf

    我是将VS2012 升级到VS2017,然后对以前的项目重新编译, 就出现了下面错误 错误 LNK2019 无法解析的外部符号 __imp__vsnprintf,该符号在函数 *******中被引用 ...

  3. 本博客采用 CC BY-NC-SA 4.0 进行许可

    本博客采用 CC BY-NC-SA 4.0 进行许可

  4. Ubuntu 14.04 安装mysql

    Ubuntu 14.04 没有mysql5.7的源,需要连接外部资源下载安装. wget http://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.d ...

  5. 在Azure DevOps Server 中提交Maven 依赖包(mvn deploy-file)

    Contents 1. 概述 2. 必要准备 安装Java 下载安装Maven 3. 服务器配置 新建连接源 4. 客户端配置 5. 上传maven包文件 6. 常见问题 Maven最新版本3.6.2 ...

  6. es6的map()方法解释

    es6的map()方法解释   map方法的作用不难理解,即“映射”,也就是原数组被“映射”成对应新数组.下面这个例子是数值项求平方: var data = [1, 2, 3, 4]; var arr ...

  7. 海边拾贝-G-若干有用的文章(乱序,经常更新)

    若干有用的文章,乱序版本.会经常性修改.     若干Python模块的介绍不错 https://www.cnblogs.com/sui776265233/category/1239819.html ...

  8. R语言填充空缺值

    在R语言中, imputeMissings包的特点是,如果空值是数值型,则使用median代替,如果使用的是character类型,则使用mode值代替. imputeMissing中,需要的包是im ...

  9. 未初始化内存检测(MSan)

    https://github.com/google/sanitizers/wiki https://github.com/google/sanitizers/wiki/MemorySanitizer ...

  10. IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键

    IDEA查看类 成员变量  局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...