Codeforces Round #601 (Div. 2) ---- 比赛传送门

周二晚因为身体不适鸽了,补题补题

A

  1. // http://codeforces.com/contest/1255/problem/A
  2. /*
  3. 签到题 简单的贪心题
  4. 本考虑过是否有先小于再加上去会更小的情况
  5. 但两种情况恰好步数是一样的
  6. */
  7. #include<iostream>
  8. #include<cstdio>
  9. #include<cmath>
  10. using namespace std;
  11. int T;
  12. int a, b;
  13. int num[] = { 5, 2, 1 };
  14. int main()
  15. {
  16. scanf("%d", &T);
  17. while(T--){
  18. scanf("%d %d", &a, &b);
  19. int ans = 0, tmp, i = 0;
  20. if(a != b){
  21. tmp = abs(a - b);
  22. while(tmp){
  23. int div = tmp / num[i];
  24. ans += div;
  25. tmp -= num[i] * div;
  26. i++;
  27. }
  28. }
  29. printf("%d\n", ans);
  30. }
  31. return 0;
  32. }

B

  1. // http://codeforces.com/contest/1255/problem/B
  2. /*
  3. 图形...
  4. 既然 m <= n 的话,要满足题目的要求就只能 m == n 了
  5. 那既然如此......把冰箱都连成环就 Ok 了
  6. */
  7. #include<iostream>
  8. #include<cstdio>
  9. #include<algorithm>
  10. using namespace std;
  11. int T, n, m;
  12. int main()
  13. {
  14. scanf("%d", &T);
  15. while(T--){
  16. scanf("%d %d", &n, &m);
  17. int a, tot = 0;
  18. for(int i = 1; i <= n; i++){
  19. scanf("%d", &a); tot += a;
  20. }
  21. if(n < 3 || m != n) printf("-1\n"); // 特判:当出现这种情况时,是肯定不符合的
  22. else {
  23. printf("%d\n", tot * 2);
  24. for(int i = 1; i <= n; i++){
  25. printf("%d %d\n", i, i % n + 1);
  26. }
  27. }
  28. }
  29. return 0;
  30. }

C

  1. // http://codeforces.com/contest/1255/problem/C
  2. /*
  3. 找规律 ---- 拓扑排序
  4. 首尾的数是最好找的,因为只会出现一次
  5. 根据样例分析
  6. 5
  7. 4 3 2
  8. 2 3 5
  9. 4 1 2
  10. 依次出现的次数
  11. 1:1 2:3 3:2 4:2 5:1
  12. 可见, 1, 5各只出现了 1 次 因此首尾分别是 1 5,然后 2 出现了 3 次 所以 2 是中间数
  13. 然后 3 4 就可以根据 1 2 的收尾排序就可以确认了
  14. 1 4 2 3 5
  15. 或者
  16. 5 3 2 4 1
  17. 因此,每次找 tot[] 为 1 的数加进首跟尾
  18. 要提前记录每个点所在的 arr 位置(减少查找时的时间)
  19. ----拓扑排序
  20. 但由于自己实现太繁琐,所以没实现出来就去找AC的代码,发现了dalao的凝练版
  21. ----参考了 yongwhan dalao的代码,#65412415
  22. */
  23. #include<iostream>
  24. #include<cstdio>
  25. #include<vector>
  26. using namespace std;
  27. int n;
  28. int a, b, c;
  29. int tot[100005];
  30. bool used[100005];
  31. vector<int> num[100005];
  32. /*
  33. 对该代码的分析:
  34. 因为每组只有3个数
  35. 所以对于样例 1 4 2 3 5 这组数据
  36. 1 的相邻有 4 2
  37. 4 的相邻有 1 2 3
  38. 2 的相邻有 1 4 3 5
  39. ...
  40. 先找出 1 (这个很好找)
  41. 找出 1 后可以确立第二个数是 4 (因为 4 只出现了两次,而 2 出现了 3 次)
  42. 然后从 1 开始找 "下一个数", 此时与 1 相邻的只有 2 了 ---- 输出,并记录其已被使用
  43. 接着从 4 开始找还未被使用过且相邻的数,于是进而找到 3
  44. 接着从 2 开始找,接着就找到了 5
  45. 即便 n > 5 这样的方法也是成立的,如
  46. n = 7; 排序是 3 2 1 7 6 5 4
  47. 先找到 3 2
  48. 然后从 3 开始找,相邻的还没用的就只剩下 1
  49. 接着从 2 开始找,同理还剩下 7
  50. 继续从 1 开始找,同理还剩下 6
  51. 继续从 7 开始找,剩下 5
  52. 最后从 6 开始找,最后的是 4
  53. ...
  54. 所以dalao的代码还是tql
  55. */
  56. int main()
  57. {
  58. scanf("%d", &n);
  59. for(int i = 0; i < n - 2; i++){
  60. scanf("%d %d %d", &a, &b, &c);
  61. num[a].push_back(b); num[a].push_back(c);
  62. num[b].push_back(a); num[b].push_back(c);
  63. num[c].push_back(a); num[c].push_back(b);
  64. tot[a]++; tot[b]++; tot[c]++;
  65. }
  66. int x, y, z;
  67. for(int i = 1; i <= n; i++){
  68. if(tot[i] == 1){
  69. x = i;
  70. break;
  71. }
  72. }
  73. if(tot[num[x][0]] == 2) y = num[x][0];
  74. else y = num[x][1];
  75. used[x] = used[y] = true;
  76. printf("%d %d ", x, y);
  77. // 以下的注释可以去掉输出看看更方便理解...
  78. for(int i = 1; i <= n - 2; i++){
  79. // printf("\nx:%d\n", x);
  80. for(int j = 0; j < num[x].size(); j++){ // 找到相邻且未被使用过的点
  81. // printf("j:%d num[x][]:%d used:%d\n", j, num[x][j], used[num[x][j]]);
  82. if(!used[num[x][j]]) { // 由于特殊性,这个点只有 1 个
  83. z = num[x][j];
  84. // printf("z:%d\n", z); // 从这里看出,每次这么进行的时候 z 只改变了一次
  85. }
  86. }
  87. used[z] = true;
  88. printf("%d ", z);
  89. x = y; y = z;
  90. }
  91. return 0;
  92. }
  93. // 下面是我自己敲的臃肿代码 思想是运用拓扑排序加优化 结果把自己绕晕了
  94. //#include<iostream>
  95. //#include<cstdio>
  96. //#include<stack>
  97. //#include<vector>
  98. //#include<algorithm>
  99. //#include<queue>
  100. //#include<stack>
  101. //using namespace std;
  102. //
  103. //int n;
  104. //struct jilu{
  105. // int tot, who;
  106. //}cot[100005]; // tot 记录 who 出现了多少次;
  107. //struct node{
  108. // int a, b, c;
  109. //}arr[100005];
  110. //bool used[100005]; // 记录哪个arr已经被用过
  111. //vector<int> tmp[100005]; // 记录数字 i 所在输入数组里的位置
  112. //queue<int> take; // 本次进行了减减的数
  113. //stack<int> ans2;
  114. //queue<int> ans1;
  115. //
  116. //bool cmp(jilu a, jilu b){
  117. // if(a.tot == b.tot) return a.who < b.who;
  118. // return a.tot < b.tot;
  119. //}
  120. //
  121. //
  122. //int main()
  123. //{
  124. // scanf("%d", &n);
  125. // for(int i = 1; i <= n - 2; i++){
  126. // scanf("%d %d %d", &arr[i].a, &arr[i].b, &arr[i].c);
  127. // cot[arr[i].a].tot++; cot[arr[i].b].tot++; cot[arr[i].c].tot++;
  128. // cot[arr[i].a].who = arr[i].a;
  129. // cot[arr[i].b].who = arr[i].b;
  130. // cot[arr[i].c].who = arr[i].c;
  131. // tmp[arr[i].a].push_back(i);
  132. // tmp[arr[i].b].push_back(i);
  133. // tmp[arr[i].c].push_back(i);
  134. // }
  135. //
  136. // sort(cot + 1, cot + n + 1, cmp);
  137. //
  138. // ans1.push(cot[1].who); ans2.push(cot[2].who);
  139. // for(int i = 0; i < tmp[cot[1].who].size(); i++){ // 首的初始化
  140. // cot[cot[1].who].tot--;
  141. // int p = tmp[cot[1].who][i];
  142. // used[p] = true;
  143. // if(arr[p].a != cot[1].who) {
  144. // cot[arr[p].a].tot--;
  145. // take.push(arr[p].a);
  146. // }
  147. // if(arr[p].b != cot[1].who) {
  148. // cot[arr[p].b].tot--;
  149. // take.push(arr[p].b);
  150. // }
  151. // if(arr[p].c != cot[1].who) {
  152. // cot[arr[p].c].tot--;
  153. // take.push(arr[p].c);
  154. // }
  155. // }
  156. //
  157. // for(int i = 0; i < tmp[cot[2].who].size(); i++){ // 尾的初始化
  158. // cot[cot[2].who].tot--;
  159. // int p = tmp[cot[2].who][i];
  160. // used[p] = true;
  161. // if(arr[p].a != cot[2].who) {
  162. // cot[arr[p].a].tot--;
  163. // take.push(arr[p].a);
  164. // }
  165. // if(arr[p].b != cot[2].who) {
  166. // cot[arr[p].b].tot--;
  167. // take.push(arr[p].b);
  168. // }
  169. // if(arr[p].c != cot[2].who) {
  170. // cot[arr[p].c].tot--;
  171. // take.push(arr[p].c);
  172. // }
  173. // }
  174. //
  175. // while(!take.empty()){
  176. // ...
  177. // }
  178. //
  179. // return 0;
  180. //}

D

  1. // http://codeforces.com/contest/1255/problem/D
  2. // 参考:HazemAk1 的 #65396404 的 AC 代码
  3. /*
  4. 要使 k 头奶牛在点上取得的 R 尽量均匀 ---- 即最大与最小的差 <= 1
  5. 要求每头牛所占的 R 的数目很简单
  6. 关键是处理图的连块问题
  7. 搜索
  8. */
  9. #include<iostream>
  10. #include<cstdio>
  11. #include<cstring>
  12. #include<queue>
  13. using namespace std;
  14. const char out[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 62种输出情况
  15. int T, H, W, k, R, now;
  16. char maze[102][102];
  17. char ans[102][102];
  18. int have[70];
  19. //bool used[102][102];
  20. //struct node{
  21. // int h, w;
  22. //};
  23. //queue<node> q;
  24. //int dw[] = { 1, 0, -1, 0 };
  25. //int dh[] = { 0, 1, 0, -1 };
  26. void solve(){
  27. int x = 0, y = 0;
  28. for(int i = 0; i < k; i++){
  29. while((have[i] || i == k - 1) && x < H){ // 当还没选够选够或者是最后一头牛的时候就继续进行, x 还没到达最大行的时候继续进行
  30. ans[x][y] = out[i]; // 既然还没有找完 那该点就是当前牛的位置啦
  31. if(maze[x][y] == 'R') have[i]--; // 如果有一饭点就减减
  32. if(x % 2 == 0){ // 当此时为偶数行的时候就从左往右遍历(因为是从0开始)
  33. y++;
  34. if(y > W - 1) x++, y = W - 1; // 下一行操作
  35. }
  36. else { // 同理 当此时为奇数行的时候就从右往左遍历
  37. y--;
  38. if(y < 0) x++, y = 0; // 下一行操作
  39. }
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. scanf("%d", &T);
  46. while(T--){
  47. R = 0; // 记录总的R点数
  48. memset(used, false, sizeof(used));
  49. scanf("%d %d %d", &H, &W, &k);
  50. for(int i = 0; i < H; i++){
  51. scanf("%s", maze[i]);
  52. for(int j = 0; j < W; j++){
  53. if(maze[i][j] == 'R') R++;
  54. }
  55. }
  56. // 给每头牛所占有的R点个数赋值
  57. int l = R / k;
  58. int lea = R - k * l;
  59. for(int i = 0; i < k; i++){
  60. have[i] = l + (lea > 0);
  61. lea--;
  62. }
  63. solve();
  64. // 输出
  65. for(int i = 0; i < H; i++){
  66. for(int j = 0; j < W; j++){
  67. printf("%c", ans[i][j]);
  68. }
  69. printf("\n");
  70. }
  71. // 以下是我自己写的方法,繁杂,不利索
  72. // now = 0;
  73. // for(int i = 0; i < H; i++){
  74. // for(int j = 0; j < W; j++){
  75. // if(!used[i][j]){
  76. ////// printf("now:%d\n", now);
  77. //// used[i][j] = true;
  78. //// if(maze[i][j] == 'R') have[now]--;
  79. ////// printf("h:%d w:%d have:%d\n", i, j, have[now]);
  80. //// q.push({i, j});
  81. //// bfs();
  82. //// now++;
  83. // dfs(i, j, now, have[now]);
  84. // }
  85. // }
  86. // }
  87. }
  88. return 0;
  89. }
  90. //bfs 也绕晕了自己
  91. //void bfs(){
  92. // bool flag = false;
  93. // while(!q.empty()){
  94. // node n = q.front(); q.pop();
  95. // ans[n.h][n.w] = out[now];
  96. //
  97. // for(int i = 0; i < 4; i++){
  98. // int nh = n.h + dh[i]; int nw = n.w + dw[i];
  99. // if(0 <= nh && nh < H && 0 <= nw && nw < W && !used[nh][nw] && (now == k - 1 || !flag)){
  100. // used[nh][nw] = true;
  101. // q.push({nh, nw});
  102. // if(maze[nh][nw] == 'R'){
  103. //// printf("now:%d nh:%d nw:%d maze:%c\n", now, nh, nw, maze[nh][nw]);
  104. // have[now]--;
  105. // if(have[now] == 0 && now != k - 1){
  106. // flag = true;
  107. // }
  108. // }
  109. // }
  110. // }
  111. // }
  112. //}
  113. // 我这个 dfs 有坑
  114. //void dfs(int h, int w, int &now, int &tot){
  115. // used[h][w] = true;
  116. // ans[h][w] = out[now];
  117. // if(maze[h][w] == 'R'){
  118. // tot--;
  119. // maze[h][w] = '.';
  120. // if(tot == 0 && now != k - 1){
  121. // now++;
  122. // return ;
  123. // }
  124. // }
  125. //
  126. // for(int i = 0; i < 4; i++){
  127. // int nh = h + dh[i]; int nw = w + dw[i];
  128. // if(0 <= nh && nh < H && 0 <= nw && nw < W && !used[nh][nw]){
  129. // dfs(nh, nw, now, tot);
  130. // if(tot == 0) return ;
  131. // }
  132. // }
  133. //}

因为没有打比赛所以就没有这次的rating啦w

【cf比赛记录】Codeforces Round #601 (Div. 2)的更多相关文章

  1. Codeforces Round #601 (Div. 2) C League of Leesins

    把每一次输入的一组数字存下来,然后把每个数字出现的组数存下来 然后找只出现过一次的数字a,那么这个数字a不是开头就是结尾,默认为开头(是哪个都无所谓),然后去找和它出现在同一组的两个数字b和c,而b和 ...

  2. Codeforces Round #601 (Div. 2)

    传送门 A. Changing Volume 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/19 22:37:33 */ #include ...

  3. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version)

    Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) N个盒子,每个盒子有a[i]块巧克力,每次操作可以将盒子中的 ...

  4. Codeforces Round #601 (Div. 2) E1 Send Boxes to Alice (Easy Version)

    #include <bits/stdc++.h> using namespace std; typedef long long ll; ; int a[N]; int n; bool pr ...

  5. Codeforces Round #601 (Div. 2) D Feeding Chicken

    //为了连贯,采取一条路形式,从第一行开始 也就是s型 #include <bits/stdc++.h> using namespace std; ; char str[MAXN][MAX ...

  6. Codeforces Round #601 (Div. 2) B Fridge Lockers

    //题目要求的是每一个点最少要有两条边连接,所以可以先构成一个环.然后再把剩余的最短的边连接起来 #include<iostream> #include<algorithm> ...

  7. Codeforces Round #601 (Div. 2) A Changing Volume

    好吧,其实我拿到这个题的时候,首先想到了bfs,写完之后,开开森森的去交代码,却在第二个数据就TEL,然后优化半天,还是不行. 最终,我盯着1,2,5发呆半天,wc,然后直接贪心 #include&l ...

  8. Codeforces Round #601 (Div. 2)E(寻找质因子,DP)

    先分解质因数,对于当前a[i],假设当前的质因数为x,这个位置要满足能被k整除,有两个可能,要么是它向后一个转移x%k个,要么是后一个向它转移k-x%k个. 对于每一个a[i]满足后,因为只会对下一个 ...

  9. Codeforces Round #601 (Div. 2)D(蛇形模拟)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; vector<char>an ...

随机推荐

  1. Myeclipse6.5迁移到IDEA

    背景 myeclipse开发的javaweb项目用svn管理.现要转用idea开发.因为发现idea实在是太好用了.myeclipse6.5是个纯净版,用了两年,对于新手来说用myeclipse6.5 ...

  2. 下一代微服务-ServiceMesh

    1.简介 系统服务化之后,服务间通信需要关注什么? 服务发现.负载均衡.路由.流控.通信可靠性.弹性.安全.监控.日志 API网关可以集中式的管理这些功能,但是会出现单点故障,并且实现起来网关会变得越 ...

  3. Java 基本类型包装类Wrapper

    一.包装类概述 1.为什么需要包装类 Java并不是纯面向对象的语言.Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的.基本数据类型有它的优势:性能(效率高,节省空间). ...

  4. Java 之 可变字符序列:字符串缓冲区(StringBuilder 与 StringBuffer)

    一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: public class StringDemo { public ...

  5. Dubbo 几个很实用但是很少人知道的功能

    dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能; 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...

  6. Scroller——startScroll、fling(惯性滑动)

    Scroller主要用于平滑滚动,主要使用的滚动方法有:startScroll.fling. startScroll(int startX, int startY, int dx, int dy, i ...

  7. Java JDBC 数据源

    数据源有2种: 普通数据源     即数据库驱动自带的数据源 连接池     包括数据库驱动自带的连接池,以及DBCP.C3P0等常用的第三方连接池. 数据库驱动自带的数据源 //从propertie ...

  8. rpm安装与yum安装的区别

      linux下的安装包多为rpm安装包.通常安装方法为 rpm -ivh 包的路径+包名.rpm 其中参数-i为安装 -v显示信息 -h显示进度条.这三个参数基本捆绑使用rpm的路径不单可以是本地磁 ...

  9. php workerman定时任务

    一.下载workerman https://www.workerman.net/download 二.下载workerman/mysql http://doc3.workerman.net/64020 ...

  10. 接触手机脚本编程------基于触动精灵的lua编程

    Auto.js好用多了,还不用root直接能用,我为什么学这个呢..... 最近因为学习需要开始接触一门新的脚本语言,我更深刻的发现了,语言只是一种工具,重要的是解决问题的思维,由于这次是需要我快速掌 ...