有毒,自从上次选拔赛(哭哭)一个垃圾bfs写错之后,每次写bfs都要WA几发。。。好吧,其实也就这一次。。。

小白说的对,还是代码能力不足。。。

非常不足。。。


题目链接:

http://codeforces.com/contest/659/problem/F

题意:

n*m的格子,每个格子一个数,必须从格子中减去任意一个小于等于这个数的数。

给定数字k,要求:

  1. 剩下的格子数字和为k。
  2. 所有非零的格子的数字应该相同。
  3. 至少一个格子的数字没有改变。
  4. 含有非零数字的格子应该连通。

分析:

枚举每个能被k整除以及整除后小于n*m的格子的数字,bfs找格子,看联通块是否满足条件。

之前没有加任何优化,TLE on 95。

后来另设一个数组,记录已经枚举过的数,遇到与之前相同的数,说明这个数不满足,可以直接跳过,不用考虑。

代码:

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6. const int maxn = 1e3 + 5;
  7. #define x first
  8. #define y second
  9. #define sa(a) scanf("%d", &a)
  10. #define sal(a) scanf("%I64d", &a)
  11. typedef pair<int, int> pii;
  12. int vis[maxn][maxn];
  13. int a[maxn][maxn], c[maxn][maxn];
  14. int m, n;
  15. long long k;
  16. int dx[4] = {1, -1, 0, 0};
  17. int dy[4] = {0, 0, -1, 1};
  18. bool bfs(pii pa, int res)
  19. {
  20. queue<pii>q;
  21. memset(vis, false, sizeof(vis));
  22. vis[pa.x][pa.y] = true;
  23. q.push(pa);
  24. int cnt = 1;
  25. while(!q.empty()){
  26. pii t = q.front();q.pop();
  27. int x = t.x, y = t.y;
  28. if(cnt == res) return true;
  29. for(int i = 0; i < 4; i++){
  30. int nx = x + dx[i];
  31. int ny = y + dy[i];
  32. if(nx >= 0 && nx < n && ny >= 0 && ny < m && !vis[nx][ny]){
  33. if(a[nx][ny] < a[pa.x][pa.y]) continue;
  34. if(a[nx][ny] == a[pa.x][pa.y]) c[nx][ny] = 1;
  35. vis[nx][ny] = true;
  36. cnt ++;
  37. q.push(pii(nx, ny));
  38. if(cnt == res) return true;
  39. }
  40. }
  41. }
  42. return false;
  43. }
  44. int solve()
  45. {
  46. for(int i = 0; i < n; i++){
  47. for(int j = 0; j < m; j++){
  48. if(c[i][j]) continue;
  49. long long cnt = k/ a[i][j];
  50. if(k % a[i][j] == 0 && cnt <= m * n){
  51. if(bfs(pii(i, j), cnt)) return a[i][j];
  52. }
  53. }
  54. }
  55. return -1;
  56. }
  57. int main (void)
  58. {
  59. sa(n),sa(m),sal(k);
  60. for(int i = 0; i < n; i++){
  61. for(int j = 0; j < m; j++){
  62. sa(a[i][j]);
  63. }
  64. }
  65. int ans = solve();
  66. if(ans == -1) return printf("NO\n"), 0;
  67. printf("YES\n");
  68. for(int i = 0; i < n; i++){
  69. for(int j = 0; j < m; j++){
  70. if(vis[i][j]) printf("%d%c", ans, j == m - 1? '\n':' ');
  71. else printf("0%c", j == m - 1?'\n':' ');
  72. }
  73. }
  74. return 0;
  75. }

Codeforces 659F Polycarp and Hay【BFS】的更多相关文章

  1. Codeforces 659F Polycarp and Hay 并查集

    链接 Codeforces 659F Polycarp and Hay 题意 一个矩阵,减小一些数字的大小使得构成一个连通块的和恰好等于k,要求连通块中至少保持一个不变 思路 将数值从小到大排序,按顺 ...

  2. CodeForces - 580C Kefa and Park 【BFS】

    题目链接 http://codeforces.com/problemset/problem/580/C 题意 根节点是 1 然后所有的叶子结点都是饭店 从根节点到叶子结点的路径上 如果存在 大于m 个 ...

  3. codeforces 540 C Ice Cave【BFS】

    题意:给出一个n*m的矩阵,“.”代表完整的冰,“X”代表破碎的冰,现在为了前进,需要掉下去一层,唯一的方法就是从破碎的冰上面掉下去 然后给出起点还有终点,问能否可达 即为到达终点的时候,终点必须是破 ...

  4. codeforces 659F . Polycarp and Hay 搜索

    题目链接 遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索. 将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列. 不断重复, 直到 ...

  5. CodeForces 659F Polycarp and Hay

    并查集,$dfs$. 从大的数字往里加,每加一个数字合并一下连通块,判断连通块内数字个数是否够,以及k能不能被当前加入的数字整除.然后$dfs$一下构造答案. #pragma comment(link ...

  6. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  7. Codeforces 716B Complete the Word【模拟】 (Codeforces Round #372 (Div. 2))

    B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. 【bfs】抓住那头牛

    [题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...

  9. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

随机推荐

  1. 在windows上安装Jenkins---tomcat流

    在windows上安装Jenkins有两种方式: (1)jar流 在命令行中运行:java -jar jenkins.war 浏览器访问 localhost:8080,创建初始管理员帐号即可. (2) ...

  2. BZOJ 2157: 旅游 (2017.7.21 6:30-2017.7.21 15:38 今日第一题。。)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1754  Solved: 765 Description Ray 乐忠于旅游,这次他来到了T 城.T ...

  3. liunx 常用的命令

    常用命令 ======================输入模式=================== Ctrl+d 向前缩进 Ctrl+t 向后缩进 =====================光标模式 ...

  4. c语言 错误记录

    1.预处理错误 #include <>   //系统内部的 #include ""   // 自定义的 遇到 not find------解决方案:gcc -I 跟查找 ...

  5. uva10735 Euler Circuit

    题外话:很多混合图问题可以转化为有向图问题(将无向边拆为两条有向边) 本题不行,因为只能经过一次 这种问题能想到网络流.. 复习欧拉回路:入度==出度 和uva1380有点相似,要先给无向边定向.原图 ...

  6. rfcn讲解博客

    http://www.cnblogs.com/lillylin/p/6277094.html ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'(W'和H'是ROI的 ...

  7. faster rcnn训练过程讲解

    http://blog.csdn.net/u014696921/article/details/60321425

  8. swift中的as?和as!

    as操作符用来把某个实例转型为另外的类型,由于实例转型可能失败,因此Swift为as操作符提供了两种形式:选项形式as?和强制形式as 选项形式(as?)的操作执行转换并返回期望类型的一个选项值,如果 ...

  9. 万能的搜索--之DFS(二)

    (一)深度优先搜索(DFS) 我们先给出深度优先的解决办法,所谓深度优先搜索,在迷宫问题里就是不撞南墙不回头,能走得深一点就尽量深一点.如果碰到了墙壁就返回前一个位置尝试其他的方向.在<啊哈!算 ...

  10. Java之浅拷贝与深拷贝

    ----?浅拷贝 --- 概念 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.简单说,浅拷贝就是只复制所考虑的对象,而不复制它所引用的对象 --- 实现方 ...