2015暑假多校联合---Cake(深搜)
题目链接:HDU 5355
http://acm.split.hdu.edu.cn/showproblem.php?pid=5355
Note that you cannot divide a whole cake into small pieces that is each cake must be complete in the m parts. Each cake must belong to exact one of m parts.
The first contains two integers n and m (1≤n≤105,2≤m≤10), the number of cakes and the number of soda.
It is guaranteed that the total number of soda in the input doesn’t exceed 1000000. The number of test cases in the input doesn’t exceed 1000.
If it is possible, then output m lines denoting the m parts. The first number si of i-th line is the number of cakes in i-th part. Then si numbers follow denoting the size of cakes in i-th part. If there are multiple solutions, print any of them.
题意:输入n,m 表示有n个蛋糕,大小为1~n,要均分给m个人,但是每一个蛋糕不能切分,给每个人的蛋糕必须是完整的,输出分配方案;
思路:刚开始,我是用贪心划分的,每个人应该划分的量h=(n+1)*n/2/m 首先给一个人分一个最大的蛋糕x,接下来分h-x,如果h-x已经给别人了,那么继续向下找h-x-1....
这样做是有bug的如23 6 这个数据就会输出NO ,但实际上是有解的YES
3 11 12 23
4 1 10 13 22
4 2 9 14 21
4 3 8 15 20
4 4 7 16 19
4 5 6 17 18
故这样贪心的做法有bug;
正解:深搜枚举出所有的情况,找到正确的划分方案,这里有一个很好的可以优化,可以发现任取2*m个连续的数都可以均分给m个人,并且n>=2*m-1时才有划分方案,所以令nn=(n-2*m+1)%2*m+2*m-1 从nn+1到n是x*2*m,这部分很好划分,那么只需要对1~nn进行深搜即可;
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
using namespace std;
int n,m,nn,h;
bool vis[]; set<int>s[];
set<int>::iterator it; int dfs(int cnt,int pos,int sum)
{
if(cnt==m+) return ;
for(int i=pos;i>=;i--)
{
if(!vis[i])
{
vis[i]=true;
if(i+sum<h)
{
s[cnt].insert(i);
if(dfs(cnt,pos-,sum+i)) return true;
s[cnt].erase(i);
}
else if(i+sum==h)
{
s[cnt].insert(i);
if(dfs(cnt+,n,)) return true;
s[cnt].erase(i);
}
vis[i]=false;
}
}
return ;
} int main()
{
int T;
cin>>T;
while(T--)
{
for(int i=;i<;i++)
s[i].clear();
scanf("%d%d",&nn,&m);
if(nn<*m-||(long long)(nn+)*nn/%m!=) {puts("NO"); continue;}
n=(nn-*m+)%(*m)+*m-;
h=(n+)*n//m;
memset(vis,false,sizeof(vis)); dfs(,n,); int go=(nn-*m+)%(*m)+*m-;
int k=(nn-*m+)/(*m);
for(int i=;i<=k;i++)
{
for(int j=;j<=m;j++)
{
s[j].insert(go+j);
s[j].insert(go+*m+-j);
}
go+=*m;
}
puts("YES");
for(int i=;i<=m;i++)
{
printf("%d",s[i].size());
for(it=s[i].begin();it!=s[i].end();it++)
printf(" %d",*it);
puts("");
}
}
}
2015暑假多校联合---Cake(深搜)的更多相关文章
- 2015暑假多校联合---Friends(dfs枚举)
原题链接 Problem Description There are n people and m pairs of friends. For every pair of friends, they ...
- 2015暑假多校联合---Mahjong tree(树上DP 、深搜)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5379 Problem Description Little sun is an artis ...
- 2015暑假多校联合---CRB and His Birthday(01背包)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5410 Problem Description Today is CRB's birthda ...
- 2015暑假多校联合---Expression(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5396 Problem Description Teacher Mai has n numb ...
- 2015暑假多校联合---Zero Escape(变化的01背包)
题目链接 http://acm.hust.edu.cn/vjudge/contest/130883#problem/C Problem Description Zero Escape, is a vi ...
- 2015暑假多校联合---Assignment(优先队列)
原题链接 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbere ...
- 2015暑假多校联合---Problem Killer(暴力)
原题链接 Problem Description You are a "Problem Killer", you want to solve many problems. Now ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 2016暑假多校联合---Windows 10
2016暑假多校联合---Windows 10(HDU:5802) Problem Description Long long ago, there was an old monk living on ...
随机推荐
- 知方可补不足~SqlServer自动备份数据库及清理备份文件
回到目录 对于SQLSERVER这个关系型数据库来说,为了保持数据的安全,备份是必须的,当你的一个误操作导致数据丢失,这可能是灾难性的,是不被允许发生的,这时,我们必须要做好定期的备份工作,如我们可以 ...
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
- 搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展
上一篇:搭建LNAMP环境(四)- 源码安装PHP7 一.安装Redis 1.创建redis用户组和用户 groupadd redis useradd -r -g redis -s /sbin/nol ...
- javascript_basic_04之节点、元素
1.DOM:文档对象模型,Document Object Model: 2.BOM:浏览器对象模型,Browser Object Model: 3.DOM组成:核心DOM,XML DOM,HTML D ...
- SQL Server 2012 T-SQL 新特性
序列 Sequence SQL Server 现在将序列当成一个对象来实现,创建一个序列的例子语法如下: CREATE SEQUENCE DemoSequence START WITH 1 INCRE ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- HTML5移动Web开发(四)——移动设计
桌面网站的设计趋势是固定布局(fixed layout)或流体布局(fluid layout),而在移动网站中我们应该始终使用流体布局,它可以使你的网站适应不同的设备尺寸. 固定宽度布局(Fixed ...
- Hadoop阅读笔记(二)——利用MapReduce求平均数和去重
前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...
- angularjs学习总结 详细教程(转载)
1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...
- java类加载器-系统类加载器
系统类加载器 系统类加载器可能都耳详能熟,但是为了完整点,还是先简单的说说系统的类加载器吧. public class Test { public static void main(String[] ...