北大ACM(POJ1020-Anniversary Cake)
Question:http://poj.org/problem?id=1020
问题点:DFS。
Memory: 260K Time: 47MS
Language: C++ Result: Accepted #include <iostream>
using namespace std; int mat[];//按列记录小块Cake填充状态
int side[];//小块Cake边长
bool visit[];//小块Cake是否已使用
int width,cnt;//大块Cake边长 小块Cake数量
bool flag;//是否能被填充标志
int cmp(const void* a,const void* b)
{
return *(int*)b - *(int*)a;//降序排列
}
//状态更新: pn为1时,从x列开始填充第idx块Cake,并判断是否能填充进去
// pn为-1时,从x列开始清除第idx块Cake
bool update(int idx,int x,int pn)
{
int i,temp = mat[x];
if(pn == )
{
//填充第idx块Cake后,长宽不能超过边界
if(side[idx] + x > width || mat[x] + side[idx] > width) return false;
//判断x列到x+side[idx]-1列 是否同高度
for(i=;i<side[idx];i++)
{
if(temp != mat[x+i]) return false;
}
visit[idx] = true;
}
else
{
visit[idx] = false;
}
for(i=;i<side[idx];i++)
{
mat[x+i] += side[idx]*pn;
}
return true;
}
//获取当前最小高度处的最小列,填充顺序为"从低到高,从左到右"
int getLowX()
{
int i,temp=;
for(i=;i<width;i++)
{
temp =(temp<mat[i]?temp:mat[i]);
}
for(i=;i<width && temp!= mat[i];i++);
return i;
}
//idx为已填充数 ,x为小块Cake编号
void dfs(int idx,int x)
{
if(idx == cnt) {//当全部填充完毕时,返回true
flag = true;
return;
}
for(int i=,w=;i<cnt;i++)
{
if(visit[i]) continue;//已填充的不再填充
if(w == side[i]) continue; else w = side[i];//同边长的不重复填充
if(update(i,x,))//在x列填充第i块Cake
{
dfs(idx+,getLowX());
if(flag) return;
update(i,x,-);//在x列清除第i块Cake
}
}
}
int main()
{
int eg;
cin>>eg;
while(eg--)
{
int i,j,k;
memset(mat,,sizeof(mat));
memset(side,,sizeof(side));
memset(visit,,sizeof(visit));
flag = false;
cin>>width;
cin>>cnt;
for(i=;i<cnt;i++)
{
cin>>side[i];
}
qsort(side,cnt,sizeof(int),cmp);//排序用于去重
dfs(,);
if(flag) cout<<"KHOOOOB!"<<endl;
else cout<<"HUTUTU!"<<endl;
}
//system("pause");
return ;
}
北大ACM(POJ1020-Anniversary Cake)的更多相关文章
- POJ1020 Anniversary Cake
题目来源:http://poj.org/problem?id=1020 题目大意:有一块边长为s的正方形大蛋糕,有n个客人,每个客人想分一块边长为si的正方形蛋糕.求这块大蛋糕能否恰好满足所有客人的需 ...
- 【DFS】Anniversary Cake
[poj1020]Anniversary Cake Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17203 Accep ...
- 北大ACM - POJ试题分类(转自EXP)
北大ACM - POJ试题分类 -- By EXP 2017-12-03 转载请注明出处: by EXP http://exp-blog.com/2018/06/28/pid-38/ 相关推荐文: 旧 ...
- POJ 1020 Anniversary Cake(DFS)
Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...
- poj 1020 Anniversary Cake(切正方形蛋糕+搜索)
...
- 北大 ACM 分类 汇总
1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...
- 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 像 ...
- 北大ACM题库习题分类与简介(转载)
在百度文库上找到的,不知是哪位大牛整理的,真的很不错! zz题 目分类 Posted by fishhead at 2007-01-13 12:44:58.0 -------------------- ...
随机推荐
- Windows系统下JAVA开发环境搭建
首先我们需要下载JDK(JAVA Development Kit),JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库. 下载地址:http://www.or ...
- C#.NET 如何打开高版本的sln文件
我用VS2008去打开2010版本的解决方案,提示如下 其实我可以直接打开这个csproj文件并运行 关闭之后就会提示是否创建一个新的 sln文件
- 第1章 SQL核心
第1章 SQL核心正在更新内容,请稍后
- 对“使用MyEclipse,写的jsp代码因有汉字而无法保存”问题的解决
使用MyEclipse编辑jsp时.有时会出现"使用MyEclipse,写的jsp代码因有汉字而无法保存"的现象,怎样解决呢? Window-->Preferences--& ...
- 【bzoj4196】[Noi2015]软件包管理器
裸的树链剖分. 对于安装 查询和维护到根路径 对于卸载 查询和维护子树信息 一开始线段树add[]标记要全赋值为-1 #include<algorithm> #include<ios ...
- JQuery 日期选择框
一 jeDate日期控件,关于官方的文档请查看: http://www.jayui.com/jedate/ 1 引入js文件 <script type="text/javascr ...
- 对于系统盘升级windows10怕空间不够,还是打算继续卸载一些软件
本来是打算从其他盘压缩,然后扩展,可是怕把磁盘给弄坏了,然后就保存原来的,就是看升级的推送什么时候来了.
- Django的CBV方式讲解
CBV使用配置 路径url的配置 cbv 顾名知义就是通过类的方法来调用,我们在url中配置为如下路径 url(r'^cbv.html/', views.Cbv.as_view()), 这里的Cbv是 ...
- ZOJ 3956 Course Selection System 背包DP
ZOJ3956 观察数据范围, c的值非常小 只有100 所以c的和也很有限 只有50000 是否可以从这里下手? 对于某一个c的和 我们一定希望h的和最大 才有可能是最终答案. 于是有了类似背包的d ...
- mipi差分信号原理
差分信号,什么是差分信号 一个差分信号是用一个数值来表示两个物理量之间的差异.从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的.在某些系统里,系统’地’被用作电压基准 ...