题目来源: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. 【leetcode刷题笔记】Reverse Linked List II

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  2. 前向纠错码(FEC)的RTP荷载格式

    http://www.rosoo.net/a/201110/15146.html 本文档规定了一般性的前向纠错的媒体数据流的RTP打包格式.这种格式针对基于异或操作的FEC算法进行了特殊设计,它允许终 ...

  3. Gym - 100570C: Subrect Query (巧妙的单调队列)

    De Prezer loves rectangles.He has a n × m rectangle which there is a number in each of its cells. We ...

  4. IronPython+Anthem.Net也玩 Ajax!

    在 IronPython 搭建的项目中(也可以是和 C# 的混合项目,详见我前一篇 post),可以使用 Anthem.NET 来轻松实现 Ajax 功能. 下面我简单的演示一个例子:在页面上我们分别 ...

  5. 【Android学习笔记】 点击穿透(Click Through)

    问题:开发一个App,主界面用了Activity,子页面用了Fragment.从Activity跳转到Fragment后Fragment透明,并且点击击穿到Axtivity. 分析:刚开始没有注意到点 ...

  6. 查看,上传crushmap命令

    标签(空格分隔): ceph,ceph运维,crushmap 查看crushmap命令 从mon节点获取crushmap: # ceph osd getcrushmap -o crush.map 反编 ...

  7. 排序----demo----

    排序1---冒泡法: 单向冒泡排序的基本原理就是:对于给定的n个数据,从第一个数据开始一次对相邻的两个数据进行比较,当前面的数据大于后面的数据时,交换位置,进行一轮比较和换位后,n个数据中最大的那个被 ...

  8. 问题:JsonConvert;结果:JSON详解

    JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格 ...

  9. CentOS 7 配置 ISCSI 服务器

    一.服务器配置 1.安装配置软件: yum install targetcli -y 2.进入配置界面: targetcli ,并进行如下配置: 1) /backstores/block create ...

  10. shell脚本备份系统的方法

    linux自动备份shell(使用全备份,增量备份策略) 在cron里设置,每周日晚12点执行(每周日全备份,其余时间增量备份)#vi backup.sh #!/bin/bash # definewe ...