1. Questionhttp://poj.org/problem?id=1020
  1. 问题点:DFS
  1. Memory: 260K Time: 47MS
  2. Language: C++ Result: Accepted
  3.  
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. int mat[];//按列记录小块Cake填充状态
  8. int side[];//小块Cake边长
  9. bool visit[];//小块Cake是否已使用
  10. int width,cnt;//大块Cake边长 小块Cake数量
  11. bool flag;//是否能被填充标志
  12. int cmp(const void* a,const void* b)
  13. {
  14. return *(int*)b - *(int*)a;//降序排列
  15. }
  16. //状态更新: pn为1时,从x列开始填充第idx块Cake,并判断是否能填充进去
  17. // pn为-1时,从x列开始清除第idx块Cake
  18. bool update(int idx,int x,int pn)
  19. {
  20. int i,temp = mat[x];
  21. if(pn == )
  22. {
  23. //填充第idx块Cake后,长宽不能超过边界
  24. if(side[idx] + x > width || mat[x] + side[idx] > width) return false;
  25. //判断x列到x+side[idx]-1列 是否同高度
  26. for(i=;i<side[idx];i++)
  27. {
  28. if(temp != mat[x+i]) return false;
  29. }
  30. visit[idx] = true;
  31. }
  32. else
  33. {
  34. visit[idx] = false;
  35. }
  36. for(i=;i<side[idx];i++)
  37. {
  38. mat[x+i] += side[idx]*pn;
  39. }
  40. return true;
  41. }
  42. //获取当前最小高度处的最小列,填充顺序为"从低到高,从左到右"
  43. int getLowX()
  44. {
  45. int i,temp=;
  46. for(i=;i<width;i++)
  47. {
  48. temp =(temp<mat[i]?temp:mat[i]);
  49. }
  50. for(i=;i<width && temp!= mat[i];i++);
  51. return i;
  52. }
  53. //idx为已填充数 ,x为小块Cake编号
  54. void dfs(int idx,int x)
  55. {
  56. if(idx == cnt) {//当全部填充完毕时,返回true
  57. flag = true;
  58. return;
  59. }
  60. for(int i=,w=;i<cnt;i++)
  61. {
  62. if(visit[i]) continue;//已填充的不再填充
  63. if(w == side[i]) continue; else w = side[i];//同边长的不重复填充
  64. if(update(i,x,))//在x列填充第i块Cake
  65. {
  66. dfs(idx+,getLowX());
  67. if(flag) return;
  68. update(i,x,-);//在x列清除第i块Cake
  69. }
  70. }
  71. }
  72. int main()
  73. {
  74. int eg;
  75. cin>>eg;
  76. while(eg--)
  77. {
  78. int i,j,k;
  79. memset(mat,,sizeof(mat));
  80. memset(side,,sizeof(side));
  81. memset(visit,,sizeof(visit));
  82. flag = false;
  83. cin>>width;
  84. cin>>cnt;
  85. for(i=;i<cnt;i++)
  86. {
  87. cin>>side[i];
  88. }
  89. qsort(side,cnt,sizeof(int),cmp);//排序用于去重
  90. dfs(,);
  91. if(flag) cout<<"KHOOOOB!"<<endl;
  92. else cout<<"HUTUTU!"<<endl;
  93. }
  94. //system("pause");
  95. return ;
  96. }

北大ACM(POJ1020-Anniversary Cake)的更多相关文章

  1. POJ1020 Anniversary Cake

    题目来源:http://poj.org/problem?id=1020 题目大意:有一块边长为s的正方形大蛋糕,有n个客人,每个客人想分一块边长为si的正方形蛋糕.求这块大蛋糕能否恰好满足所有客人的需 ...

  2. 【DFS】Anniversary Cake

    [poj1020]Anniversary Cake Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17203   Accep ...

  3. 北大ACM - POJ试题分类(转自EXP)

    北大ACM - POJ试题分类 -- By EXP 2017-12-03 转载请注明出处: by EXP http://exp-blog.com/2018/06/28/pid-38/ 相关推荐文: 旧 ...

  4. POJ 1020 Anniversary Cake(DFS)

    Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...

  5. poj 1020 Anniversary Cake(切正方形蛋糕+搜索)

                                                                                                         ...

  6. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

  7. Anniversary Cake

    Anniversary Cake Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15704   Accepted: 5123 ...

  8. 【poj1020】 Anniversary Cake

    http://poj.org/problem?id=1020 (题目链接) 题意 有一个S*S的大蛋糕,还有许多正方形的小蛋糕,问能否将大蛋糕完整的分成所有的小蛋糕,不能有剩余. Solution 像 ...

  9. 北大ACM题库习题分类与简介(转载)

    在百度文库上找到的,不知是哪位大牛整理的,真的很不错! zz题 目分类 Posted by fishhead at 2007-01-13 12:44:58.0 -------------------- ...

随机推荐

  1. Android自己主动提示文本框(AutoCompleteTextView)

    自己主动提示文本框(AutoCompleteTextView)能够加强用户体验,缩短用户的输入时间(百度的搜索框就是这个效果). 首先.在xml中定义AutoCompleteTextView控件: a ...

  2. oracle initialization or shutdown in progress 问题解决

    今天登录oracle时遇到oracle initialization or shutdown in progress 这个错误提示,在网上搜了下,试了非常多方法,最后结合几种方法结合,成功攻克了问题! ...

  3. 小工具:天气查询 Vs自定义设置 DevGridControl中GridView排序问题 小工具:火车票查询 小工具:邮件发送 小工具:截图&简单图像处理

    小工具:天气查询   开发一个天气查询的工具主要由两步构成,一是数据的获取,二是数据的展示.  一.数据获取 数据获取又可以分为使用其它公司提供的API和手动抓取其它网站数据. 1. 某公司提供的AP ...

  4. Velocity高速新手教程

    变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引號中的字面字符串将解析和又 ...

  5. SDUST 2844-Mineral Water(数学)

    Mineral Water nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1000ms Memory Limi ...

  6. Creo二次开发—内存处理

    #include <ProDisplist.h> ProError ProDisplistInvalidate(ProMdl model) Invalidates the two- or ...

  7. ZOJ 3684 Destroy 树的中心

    中心节点就是树的中心,2遍dfs求到树的直径.而中心一定在直径上,顺着直径找到中心就够了. 然后能够一遍树形DP找到最小值或者二分+推断是否訪问到叶子节点. #include <iostream ...

  8. hdu 5001 概率DP 图上的DP

    http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题  一则有一个点难以想到 二则就是编码有 ...

  9. MySQL-导入与导出

    CSV文件导入MySQL LOAD DATA INFILE语句允许您从文本文件读取数据,并将文件的数据快速导入数据库的表中. 导入文件操作之前,需要准备以下内容: 一.将要导入文件的数据对应的数据库表 ...

  10. 数据结构 - 希尔排序(Shell&#39;s Sort) 具体解释 及 代码(C++)

    数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2 ...