题目来源:http://poj.org/problem?id=1020

题目大意:有一块边长为s的正方形大蛋糕,有n个客人,每个客人想分一块边长为si的正方形蛋糕。求这块大蛋糕能否恰好满足所有客人的需求而不浪费。

输入:第一行为测试用例数。接下来每行的第一个数位大蛋糕的边长,第二个数位客人的数目n,接下来的n个数为每个客人想要的蛋糕的边长。

输出:若能恰好分完输出“KHOOOOB!”,否则输出“HUTUTU!”


Sample Input

2
4 8 1 1 1 1 1 3 1 1
5 6 3 3 2 1 1 1

Sample Output

KHOOOOB!
HUTUTU!

一开始用贪心方法做,即从大块的开始切,总是选最靠近左下角的位置开始切。大多数用例都可以通过,直到遇到这组数据:

10 14 1 1 1 1 1 4 4 3 3 3 3 3 3 3

发现贪心是有问题的。

后来看了牛人的思路,用DFS解决。

切蛋糕时总是自下而上,自左而右。优先切大蛋糕。

解决方案精彩的地方不在于DFS本身,而在于每切一次蛋糕,标记所有蛋糕位置的方法。标记每个格子的状态再查找会TLE。牛人想到的方法是把蛋糕“按列标记”。建立一维数组,d[s],s为大蛋糕边长,d[i]记录每列第一个为空的格子的行号。

 //////////////////////////////////////////////////////////////////////////
// POJ1020 Anniversary Cake
// Memory: 268K Time: 485MS
// Language: C++ Result: Accepted
//////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std; int s, n;
int c[];
int d[]; int sum;
bool ok; void reset() {
memset(c, , sizeof(c));
for (int i = ; i < ; ++i) {
d[i] = ;
}
sum = ;
ok = false;
} void dfs(int a) {
if (a == n) {
ok = true;
exit;
}
int i, j;
int row, clo;
bool f;
for (i = , clo = ; i <= s; ++i) {
if (d[i] < clo) {
clo = d[i];
row = i;
}
}
for (i = ; i > ; --i) {
if (c[i] > && row + i - <= s && clo + i - <= s) {
for (j = row, f = true; j <= row + i - ; ++j) {
if (d[j] > clo) {
f = false;
break;
}
}
if (f) {
for (j = row; j <= row + i - ; ++j) {
d[j] += i;
}
--c[i];
dfs(a + );
++c[i];
for (j = row; j <= row + i - ; ++j) {
d[j] -= i;
}
}
}
}
} int main(void) {
int nCase;
cin >> nCase;
for (int caseNo = ; caseNo <= nCase; ++caseNo) {
reset();
cin >> s >> n;
for (int i = ; i <= n; ++i) {
int t ;
cin >> t;
++c[t];
sum += t * t;
}
if (sum != s * s) {
cout << "HUTUTU!" << endl;
continue;
}
dfs();
if (ok) {
cout << "KHOOOOB!" <<endl;
}
else {
cout << "HUTUTU!" << endl;
}
}
system("pause");
return ;
}

POJ1020 Anniversary Cake的更多相关文章

  1. 【DFS】Anniversary Cake

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

  2. POJ 1020 Anniversary Cake(DFS)

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

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

                                                                                                         ...

  4. Anniversary Cake

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

  5. 【poj1020】 Anniversary Cake

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

  6. POJ1020(小正方形铺大正方形)

    Anniversary Cake Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16579   Accepted: 5403 ...

  7. 2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest

    A. Anniversary Cake 随便挑两个点切掉就好了. #include<bits/stdc++.h> using namespace std; const int Maxn=2 ...

  8. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  9. BFS广搜题目(转载)

    BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...

随机推荐

  1. I.MX6 Busybox watchdog

    /************************************************************************* * I.MX6 Busybox watchdog ...

  2. bzoj3595 方伯伯的oj

    有$n$个数,一开始是$1~n$,有$m$次操作 1.把编号为$x$的人编号改为$y$,保证$y$没出现过 2.把编号为$x$的人提到第一名 3.把编号为$x$的人怼到最后一名 4.查询排名为$x$的 ...

  3. [SPOJ-DISUBSTR]Distinct Substrings

    vjudge 题意 给你一个串,求不同字串个数. \(n\le10^5\) sol 直接建SAM然后输出\(\sum_{i=1}^{tot}len[i]-len[fa[i]]\) code #incl ...

  4. JavaScript RegExp 正则表达式基础详谈

    前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ...

  5. [转]JS的内存泄露处理

    问题: 1.给DOM对象添加的属性是一个对象的引用.范例: var MyObject = {}; document.getElementByIdx_x('myDiv').myProp = MyObje ...

  6. POJ2689:素数区间筛选

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15820   Accepted: 4202 D ...

  7. js字符串API

    1.charAt(n) :返回字符串n位置的字符 2.substr(n,m):n:开始截取的位置 m:截取的长度 2.substring(n,m):n:开始截取的位置 m:截取结束的位置 3.repl ...

  8. JAVA基础知识总结3(面向对象)

    特点:过程其实就是函数:对象是将函数等一些内容进行了封装 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想. 匿名对象 ...

  9. JS设置cookie、读取cookie、删除cookie(转)

    JS设置cookie.读取cookie.删除cookie 转载  2015-04-17   投稿:hebedich    我要评论 Js操作Cookie总结(设置,读取,删除),工作中经常会用到的哦! ...

  10. Java对象在内存中的状态

    可达的/可触及的 Java对象呗创建后,如果被一个或者多个变量引用,那就是可达的,即从根节点可以触及到这个对象. 其实就是从根节点扫描,只要这个对象在引用链中,那就是可触及的. 可恢复的 Java对象 ...