题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355

Problem Description

There are m soda and today is their birthday. The 1-st soda has prepared n cakes with size 1,2,…,n. Now 1-st soda wants to divide the cakes into m parts so that the total size of each part is equal.

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.

Input

There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:

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.

Output

For each test case, output “YES” (without the quotes) if it is possible, otherwise output “NO” in the first line.

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.

Sample Input

4

1 2

5 3

5 2

9 3

Sample Output

NO

YES

1 5

2 1 4

2 2 3

NO

YES

3 1 5 9

3 2 6 7

3 3 4 8

题意理解:给你n个尺寸大小分别为1,2,3,…,n的蛋糕,要求你分成m份,要求每份中所有蛋糕的大小之和均相同,如果有解,输出“YES”,并给出每份的蛋糕数及其尺寸大小,否则输出“NO”

开始的时候想的是简单的暴力(肯定没有那么简单),没想到竟然过了,但是之后的spj之后就出现错误了,所以原来的思路还是出现了问题的.

原来的代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std; #define eps 1e-8
#define INF 0x3f3f3f3f
#define LL long long
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
typedef pair<int , int> P;
#define N 100005 bool number[N];//标记蛋糕是否已经取掉
int ans[N];
int n,m; void Find(int x)//查找平均大小为x的分配方案
{
for(int i = 0; i < m; i++)
{
int temp = x,ncount = 0;
for(int j = n;j > 0 && temp != 0 ;j--)
{
if((temp - j >= 0) && number[j] == 0)//每次取能取的最大蛋糕
{
ans[ncount++] = j;
number[j] = 1;
temp -= j;
}
}
printf("%d ",ncount);
for(int j = 0; j < ncount; j++)
printf("%d ",ans[j]);
if(temp>0) cout<<"temp="<<temp<<",该组测试数据不为满足要求...";
printf("\n");
}
} int main()
{
int Case;
scanf("%d",&Case);
while(Case--)
{
scanf("%d%d",&n,&m);
int sum = ((n + 1) * n)>>1;///计算前n个蛋糕的总质量
memset(number,0,sizeof(number));///初始化标记方阵 if(sum % m == 0 && (2 * m - 1) <= n ) ///如果是总质量取余不为0 && 分不到一个
{
printf("YES\n");
Find(sum/m);
}
else
printf("NO\n");
}
return 0;
}

之后借鉴网上的代码,和官网给出的思路很想,但是没有使用递归,感觉这道题的难点有两个,一个是判断什么情况下是直接不行的,但是自己感觉好像不能理解为什么两个条件和结果是充分条件,(现在感觉只是必要条件,有点不懂。。。);另一个是需要分割为两部分,第一部分拼凑,第二部分直接分开输出就好了。

关键是思路。。。

借鉴网址:http://blog.csdn.net/queuelovestack/article/details/47321211

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
#define ll __int64
using namespace std; int solve()
{
int n,m;
int i,j,k,c,s,d,r,w[32];
set<int> v; set<int>::iterator it;
scanf("%d%d",&n,&m);
if(( (n+1)*n/2)%m || m*2-1>n )
return puts("NO"); c=(n- (m*2-1) )%(m*2)+m*2-1,///算出前一部分有多少个数
s=c*(c+1)/(m*2), ///前面每两个数的和为s
d=(n-c)/(m*2); ///后面每组有多少个 puts("YES");
for(i=1; i<=c; i++)
v.insert(i);
for( j=0,k=c+1; j<m; j++,putchar('\n') )
{
c=r=0;
while(r<s)
{
it=v.upper_bound(s-r);///查找函数,返回查找比查找值大的第一个位置指针(iterator)[使用方法]
--it;
w[c]=*it;///获得该位置指针所指向的数据
r=r+w[c++];
v.erase(it);
}
printf("%d*",c+d*2); ///输出个数 for(i=0;i<c;i++) ///前半部分
printf(" %d",w[i]); for(i=0;i<d;i++)///直接输出后半部分
printf(" %d %d",k++,n--);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
solve();
}

2015 Multi-University Training Contest 6 Cake的更多相关文章

  1. 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)

    官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...

  2. 2015 Multi-University Training Contest 8 hdu 5390 tree

    tree Time Limit: 8000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 5390 ...

  3. 2015 UESTC Winter Training #8【The 2011 Rocky Mountain Regional Contest】

    2015 UESTC Winter Training #8 The 2011 Rocky Mountain Regional Contest Regionals 2011 >> North ...

  4. 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】

    2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...

  5. Root(hdu5777+扩展欧几里得+原根)2015 Multi-University Training Contest 7

    Root Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Su ...

  6. HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6

    Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  7. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  8. HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  9. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

随机推荐

  1. AMD规范基本结构

    AMD规范:使用 define 和 require ,基本结构如下: // 定义模块 define(['moduleA', 'moduleB', 'moduleC'], function (modul ...

  2. Saiku OLAP

    简介 Saiku成立于2008年,由Tom Barber和Paul Stoellberger研发.最初叫做Pentaho分析工具,起初是基于OLAP4J库用GWT包装的一个前端分析工具.经过多年的演化 ...

  3. ASP.NET MVC 控制器向View传值的三种方法

    转自:http://www.cnblogs.com/shinima/p/3940452.html 1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResu ...

  4. sql字符串查找大小写敏感相关

    select * from table   where target_text like "3"; 等价于 select * from table   where target_t ...

  5. window7 下 安装 apache24(httpd-2.4.10-x86-r2)加 php5.6(php-5.6.4-Win32-VC11-x86)加yaf(php_yaf-2.3.3-5.6-ts-vc11-x86)整合

    window7 下 安装 apache24(httpd-2.4.10-x86-r2)加 php5.6(php-5.6.4-Win32-VC11-x86)加yaf(php_yaf-2.3.3-5.6-t ...

  6. .Net分布式缓存应用实例:Couchbase

    转自:http://www.cnblogs.com/wu-jian Couchbase概述 Couchbase最早叫Membase,是由Memcached项目组的一些头目另立的山头. 2011年与Co ...

  7. [Hibernate] - one to one

    两种不同方式的一对一映射关系: 1)配置文件: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8" ...

  8. jfinal配置rails的数据表

    鉴于rails的部署太可怕,所以有了使用rails的建表工具和migration,用jfinal来开发的想法,在此贴一下需要注意的地方 maven配置 <dependency> <g ...

  9. SQL执行效率和性能测试方法

    对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提高执行效率和整体运行性能.如何选择SQL语句,本文提供了两种方法,分别对多条SQL进行量化 ...

  10. 如何添加WebService调用时的用户认证

    场景: 当把发布好的WebService地址或WSDL提供给调用方时,需要对方先进行身份的认证通过后才允许接口的进步访问.而不是公开的谁都可以调用. 解决: 1.在IIS中设置对应网站的目录访问权限. ...