POJ1020 Anniversary Cake
题目来源: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的更多相关文章
- 【DFS】Anniversary Cake
[poj1020]Anniversary Cake Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17203 Accep ...
- POJ 1020 Anniversary Cake(DFS)
Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...
- poj 1020 Anniversary Cake(切正方形蛋糕+搜索)
...
- Anniversary Cake
Anniversary Cake Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15704 Accepted: 5123 ...
- 【poj1020】 Anniversary Cake
http://poj.org/problem?id=1020 (题目链接) 题意 有一个S*S的大蛋糕,还有许多正方形的小蛋糕,问能否将大蛋糕完整的分成所有的小蛋糕,不能有剩余. Solution 像 ...
- POJ1020(小正方形铺大正方形)
Anniversary Cake Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16579 Accepted: 5403 ...
- 2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest
A. Anniversary Cake 随便挑两个点切掉就好了. #include<bits/stdc++.h> using namespace std; const int Maxn=2 ...
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
随机推荐
- POJ3565 Ants 和 POJ2195 Going Home
Ants Language:Default Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7975 Accepted: ...
- ACM学习历程—FZU2195 检查站点(树形DP || 贪心)
Description 在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检查,各个站点间有且仅有一条通路,检查员下山前往站点时比较轻松,而上山时却需要额外的时间,问最后检查员检查完所有站点 ...
- Linux编程之错误代码
头文件/usr/include/asm-generic/errno-base.h定义错误码: #ifndef _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERI ...
- [转]JS中apply和call的联系和区别
JS中有时常用到 apply 和 call 两个方法,搜索网上很多,整理如下,简单看看这两个联系和区别, 联系: 网上查到关于apply和call的定义:这两个方法都能劫持另外一个对象的方法,继承另外 ...
- github 在线 创建文件夹
参考: http://webapps.stackexchange.com/questions/36411/create-a-folder-in-github-via-the-web-interface
- VijosP1274:神秘的咒语
描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...
- C++STL库中map容器常用应用
#include<iostream> #include<cstdio> #include<map> //按键值大小构成二叉搜索树 using namespace s ...
- web攻击之四:DOS攻击
DDOS是DOS攻击中的一种方法. DoS:是Denial of Service的简称,即拒绝服务,不是DOS操作系统,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务. ...
- JavaScript原型模式(prototype)
1.原型是一个对象,其他对象可以通过它实现属性的继承所有对象在默认的情况下都有一个原型,因为原型的本身也是对象,所以一个类的真正原型是被类的内部[prototype]属性所指出.每个函数都有一个属性叫 ...
- 不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )
在“程序包管理器控制台”使用命令“update-database”会提示:The Entity Framework Core Package Manager Console Tools don't s ...