[关闭]
@Dmaxiya 2018-08-17T10:23:43.000000Z 字数 5903 阅读 1103

Codeforces Round #442 (Div. 2)

Codeforces


Contests 链接:Codeforces Round #442 (Div. 2)
过题数:3
排名:518/12327

A. Alex and broken contest

题意

判断给定字符串 是否只包含 "Danil", "Olya", "Slava", "Ann" 和 "Nikita" 中的一个,且只包含一次。

输入

输入只包含一个字符串 ,字符串中每个字符只可能是小写字母、大写字母或者下划线。

输出

如果是则输出 ,否则输出

样例

输入 输出
Alex_and_broken_contest NO
NikitaAndString YES
Danil_and_Olya NO

题解

按题意判断。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cfloat>
  7. #include <cstring>
  8. #include <string>
  9. #include <vector>
  10. #include <list>
  11. #include <queue>
  12. #include <stack>
  13. #include <map>
  14. #include <set>
  15. #include <bitset>
  16. #include <algorithm>
  17. #include <ctime>
  18. #include <functional>
  19. #include <iomanip>
  20. using namespace std;
  21. #define LL long long
  22. unsigned int pos;
  23. string str;
  24. string sub[5] = {"Danil", "Olya", "Slava", "Ann", "Nikita"};
  25. bool judge() {
  26. int ret = 0;
  27. for(int i = 0; i < 5; ++i) {
  28. pos = str.find(sub[i]);
  29. if(pos != string::npos) {
  30. ++ret;
  31. ret += (str.find(sub[i], pos + 1) != string::npos);
  32. }
  33. }
  34. return ret == 1;
  35. }
  36. int main() {
  37. #ifdef LOCAL
  38. freopen("test.txt", "r", stdin);
  39. // freopen("out.txt", "w", stdout);
  40. #endif
  41. ios::sync_with_stdio(false);
  42. while(cin >> str) {
  43. if(judge()) {
  44. cout << "YES" << endl;
  45. } else {
  46. cout << "NO" << endl;
  47. }
  48. }
  49. return 0;
  50. }

B. Nikita and string

题意

如果一个只包含字符 'a', 'b' 的字符串可以被分割成三个部分(这三个部分中任意一个部分都可能为空),第一个部分只包含 'a',第二个部分只包含 'b',第三个部分只包含 'a',那么这个字符串就是漂亮的字符串。现在给出任意一个只包含 'a' 和 'b' 的字符串,从这个字符串中删除一些字符,使剩下的字符顺序不变地拼成的字符串是一个漂亮的字符串,问最后得到的字符串的长度最长为多少?

输入

输入只包含一个字符串 ,字符串中的每一个字符只可能为 'a' 或者 'b'。

输出

最后得到的字符串的最大长度。

样例

输入 输出 提示
abba 4 这个字符串本身就是一个漂亮的字符串。
bab 2 这个字符串需要删去其中一个 'b' 来让这个字符串成为一个漂亮的字符串。

题解

表示以第 个字符为结尾,最后形成的漂亮字符串中,第一部分的最大长度, 表示以第 个字符为结尾,最后形成的漂亮字符串中,第一部分加上第二部分的最大长度, 表示以第 个字符为结尾,最后形成的漂亮的字符串中,三个部分的最大长度,由于第一部分与第二部分的字符都是 'a',所以应该用一个 标记这个字符串中是否出现过 'b'。于是可以得到下面的 方程:


由于 表示的是离 最近的 值,所以实际上只要用 就能维护整个 ,最新的 值就是 ,时间复杂度为 (上面的 方程的时间复杂度为 )。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cfloat>
  7. #include <cstring>
  8. #include <string>
  9. #include <vector>
  10. #include <list>
  11. #include <queue>
  12. #include <stack>
  13. #include <map>
  14. #include <set>
  15. #include <bitset>
  16. #include <algorithm>
  17. #include <ctime>
  18. #include <functional>
  19. #include <iomanip>
  20. using namespace std;
  21. #define LL long long
  22. const int maxn = 5000 + 100;
  23. bool flag;
  24. int dp[3];
  25. char str[maxn];
  26. int main() {
  27. #ifdef LOCAL
  28. freopen("test.txt", "r", stdin);
  29. // freopen("out.txt", "w", stdout);
  30. #endif
  31. ios::sync_with_stdio(false);
  32. while(scanf("%s", str) != EOF) {
  33. flag = false;
  34. memset(dp, 0, sizeof(dp));
  35. for(int i = 0; str[i]; ++i) {
  36. if(str[i] == 'a') {
  37. ++dp[0];
  38. if(flag) {
  39. dp[2] = max(dp[1], dp[2]) + 1;
  40. }
  41. } else {
  42. dp[1] = max(dp[0], dp[1]) + 1;
  43. flag = true;
  44. }
  45. }
  46. printf("%d\n", max(dp[0], max(dp[1], dp[2])));
  47. }
  48. return 0;
  49. }

C. Slava and tanks

题意

在一个 的一排格子上,每一格都可能有一辆坦克,当某一辆坦克被炸弹打中时,它就会移动向旁边的一个格子里,如果某辆坦克在第 个格子里,它只能向第 个格子移动,如果某辆坦克在第 个格子里,它只能向第 个格子移动,坦克只有在被打中时才会移动,它们不会主动移动,现在要设计一个投弹方案,使得投下最少炸弹的情况下,保证所有坦克都被打中至少两次。

输入

输入只包含一个整数

输出

第一行输出一个整数 ,表示最少需要投放的炸弹数,第二行为 个整数 ,第 个整数表示第 次投放的炸弹位置。

样例

输入 输出
2 3
2 1 2
3 4
2 1 3 2

题解

首先将所有坦克逼到第奇数个格子里,然后向所有奇数格子里投弹,那些本来就在奇数格子里的坦克就会跑到偶数格子里,最后向所有偶数格子投弹,就能让所有坦克至少被傻蛋打中两次。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cfloat>
  7. #include <cstring>
  8. #include <string>
  9. #include <vector>
  10. #include <list>
  11. #include <queue>
  12. #include <stack>
  13. #include <map>
  14. #include <set>
  15. #include <bitset>
  16. #include <algorithm>
  17. #include <ctime>
  18. #include <functional>
  19. #include <iomanip>
  20. using namespace std;
  21. #define LL long long
  22. int n;
  23. bool flag;
  24. void Print(int Index) {
  25. for(int i = Index; i <= n; i += 2) {
  26. if(flag) {
  27. printf(" ");
  28. }
  29. flag = true;
  30. printf("%d", i);
  31. }
  32. }
  33. int main() {
  34. #ifdef LOCAL
  35. freopen("test.txt", "r", stdin);
  36. // freopen("out.txt", "w", stdout);
  37. #endif
  38. ios::sync_with_stdio(false);
  39. while(scanf("%d", &n) != EOF) {
  40. flag = false;
  41. printf("%d\n", n + n / 2);
  42. Print(2);
  43. Print(1);
  44. Print(2);
  45. printf("\n");
  46. }
  47. return 0;
  48. }

D. Olya and Energy Drinks

题意

在一个 的迷宫中,只有 '.''#' 两种字符,'.' 表示这个地方是一块空地,'#' 表示这块地方有障碍物,不能通过,要从起点 走到 ,每步最长可以直走 个方格(不能转弯,如果转弯则要算新的一步),问最少需要多少步。

输入

第一行包含三个整数 ,接下来 行每行一个长度为 的字符串表示迷宫,最后一行为四个整数 ,表示起点和终点。

输出

输出从起点走到终点需要的最少的步数,如果无法到达则输出

样例

输入 输出 提示
3 4 4
....
###.
....
1 1 3 1
3
3 4 1
....
###.
....
1 1 3 1
8
2 2 1
.#
#.
1 1 2 2
-1

题解

如果每次只能走一格,就是一个 ,对于每次可以走不同的长度,任意两格之间的距离就不再相等,跑最短路就要用 ,而这题在转弯的部分要算上新的步数,所以这题需要存两个方向上的距离:水平方向上的最短距离和竖直方向上的最短距离,就可以跑 了。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cfloat>
  7. #include <cstring>
  8. #include <string>
  9. #include <vector>
  10. #include <list>
  11. #include <queue>
  12. #include <stack>
  13. #include <map>
  14. #include <set>
  15. #include <bitset>
  16. #include <algorithm>
  17. #include <ctime>
  18. #include <functional>
  19. #include <iomanip>
  20. using namespace std;
  21. #define LL long long
  22. const int maxn = 1000 + 100;
  23. struct Node {
  24. int x, y;
  25. int dis;
  26. Node() {}
  27. Node(int xx, int yy, int d) {
  28. x = xx;
  29. y = yy;
  30. dis = d;
  31. }
  32. };
  33. bool operator<(const Node &a, const Node &b) {
  34. return a.dis > b.dis;
  35. }
  36. bool operator==(const Node &a, const Node &b) {
  37. return a.x == b.x && a.y == b.y;
  38. }
  39. int n, m, k;
  40. Node s, t;
  41. int dis[maxn][maxn][2];
  42. char str[maxn][maxn];
  43. priority_queue<Node> que;
  44. const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
  45. bool in(int x, int y) {
  46. return x >= 1 && x <= n && y >= 1 && y <= m;
  47. }
  48. int dij() {
  49. memset(dis, 0x3f, sizeof(dis));
  50. while(!que.empty()) {
  51. que.pop();
  52. }
  53. que.push(s);
  54. dis[s.x][s.y][0] = dis[s.x][s.y][1] = 0;
  55. while(!que.empty()) {
  56. Node tmp = que.top();
  57. que.pop();
  58. if(tmp == t) {
  59. return tmp.dis;
  60. }
  61. for(int i = 0; i < 4; ++i) {
  62. for(int j = 1; j <= k; ++j) {
  63. int xx = tmp.x + dir[i][0] * j;
  64. int yy = tmp.y + dir[i][1] * j;
  65. if(in(xx, yy) && str[xx][yy] != '#' && dis[xx][yy][i >> 1] > tmp.dis + 1) {
  66. dis[xx][yy][i >> 1] = tmp.dis + 1;
  67. que.push(Node(xx, yy, tmp.dis + 1));
  68. } else {
  69. break;
  70. }
  71. }
  72. }
  73. }
  74. return -1;
  75. }
  76. int main() {
  77. #ifdef LOCAL
  78. freopen("test.txt", "r", stdin);
  79. // freopen("out.txt", "w", stdout);
  80. #endif
  81. ios::sync_with_stdio(false);
  82. while(scanf("%d%d%d", &n, &m, &k) != EOF) {
  83. s.dis = 0;
  84. for(int i = 1; i <= n; ++i) {
  85. scanf("%s", str[i] + 1);
  86. }
  87. scanf("%d%d%d%d", &s.x, &s.y, &t.x, &t.y);
  88. printf("%d\n", dij());
  89. }
  90. return 0;
  91. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注