HDU 5355 Cake

更新后的代码:

今天又一次做这道题的时候想了非常多种思路

最后最终想出了自觉得完美的思路,结果却超时

真的是感觉自己没救了

最后加了记忆化搜索,AC了

好了先说下思路吧。不知道大家住没注意m<=10

我们能够把大部分的数据写成成对的形式比如n=27 m=6的这组数据

第1份  27  16

第2份  26  17

第3份  25  18

第4份  24  19

第5份  23  20

第6份  22  21

剩下1~15搜索出6等份分给全部人

这样成对出现的数蛇形数我们去处尽量多的偶数条

保证剩下的数的个数大于等于2*m小于4*m个

所以剩下的小于4m(小于40)个数我们仅仅解用搜索就好了

所以n 的范围就变成1~40,m的范围1~10这样我们记录这些的结果(防止这种数据大量反复出现)

这样假设我们有数据15 6计算过后

n=27  m= 6

n=39  m=6

n=15+(随意被的12) m=6

我们都不须要搜索了

就这样这个问题就攻克了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define maxn 100005
#define ll __int64
#define cnm c[nu][m]
using namespace std;
int v[15][maxn];
ll m,n;
//fun函数定义将1-num平均分给l-r个人
int a[15][50];
int si[15];
bool b[50];
int dp[50][10]={0};
int c[50][10][15][50]={0};
ll ave,nu;
bool dfs(int sum,int g,int s){
if(sum==ave){g++;sum=0;s=1;}
if(g==m-1){
for(int i=1;i<=nu;i++)
if(!b[i])a[g][++a[g][0]]=i;
return true;
}
for(int i=s;i<=nu;i++){
if(sum+i>ave) return false;
if(!b[i]){
b[i]=true;
a[g][++a[g][0]]=i;
if(dfs(sum+i,g,i+1)) return true;
b[i]=false;
a[g][0]--;
}
}
return false;
} bool fun(ll num){
if(num>=4*m-1){
for(int i=0,j=0;i<m;i++,j++){
v[i][si[i]++]=num-j;
v[i][si[i]++]=num-2*m+1+j;
}
return fun(num-2*m);
}
else {
nu=num;
ave=(num+1)*num/2/m;
int b;
if(dp[num][m]==0){
if(dfs(0,0,1)){
dp[num][m]=1;
for(int i=0;i<m;i++)
for(int j=0;j<=a[i][0];j++)
cnm[i][j]=a[i][j];
}
else dp[num][m]=-1;
}
if(dp[nu][m]==1) return true;
return false;
}
}
void out(int n){
printf("YES\n");
for(int i=0;i<n;i++){
printf("%d",si[i]+cnm[i][0]);
for(int j=0;j<si[i];j++) printf(" %d",v[i][j]);
for(int j=0;j<cnm[i][0];j++) printf(" %d",cnm[i][j+1]);
printf("\n");
}
}
void Init(){
memset(si,0,sizeof(si));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%I64d%I64d",&n,&m);
ll su=n*(n+1)/2;
ll av=su/m;
if(su%m||av<n)printf("NO\n");
else{
Init();
bool ok=fun(n);
if(ok)out(m);
else printf("NO\n");
}
}
return 0;
}

/*

此代码存在局限性数据更新后已不能在AC

待更新……

*/

这个题目看上去的时候第一感觉就是暴力,结果真的一遍就过了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define maxn 100005
#define ll __int64
using namespace std;
int a[maxn];
vector <int > v[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
ll n,m;
scanf("%I64d%I64d",&n,&m);
ll sum =(n+1)*n/2;
if(sum%m==0){
ll ave=sum/m;
if(ave<n)
printf("NO\n");
else{
memset(v,0,sizeof(v));
memset(a,0,sizeof(a));
int t=ave,A=0;
int flag=0;
for(int i=n;!flag&&i>=1;i--){
if(a[i]==0){
t-=i;
v[A].push_back(i);
a[i]=1;
}
if(i-1>t){
for(int j=i-1;t&&j>=1;j--){
if(t>=j&&a[j]==0){
v[A].push_back(j);
t-=j;
a[j]=1;
}
}
}
if(t==0){
t=ave;
A++;
}
}
if(A==m){
printf("YES\n");
for(int i=0;i<m;i++){
printf("%d",v[i].size());
for(int j=0;j<v[i].size();j++)
printf(" %d",v[i][j]);
printf("\n");
}
}
else
printf("NO\n");
}
}
else
printf("NO\n");
}
return 0;
}

HDU 5355 Cake的更多相关文章

  1. 多校第六场 1003 hdu 5355 Cake(贪心)

    题目链接:(数据加强后wa了) hdu 5355 题目大意: 给出一个蛋糕.切成1~n大小的n块.问是否能在不继续分割的情况下拼凑出m等份. 题目分析: 首先我们是可以知道每份蛋糕的尺寸的,利用n*( ...

  2. 2015多校第6场 HDU 5355 Cake 贪心,暴力DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给你n个尺寸大小分别为1,2,3,…,n的蛋糕,要求你分成m份,要求每份中所有蛋糕的大小之 ...

  3. HDU 5355 Cake (WA后AC代码,具体解析,构造题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others) ...

  4. HDU 5355 Cake(2015多校第六场,搜索 + 剪枝)

    Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  5. HDU 5355 Cake (构造 + 暴力)

    题意:给定 n,m,让你把 1 ~ n 分成 m 部分,而且每部分和是一样大的. 析:首先先判断不能分成的,第一种是 sum (1 ~ n 的和)不能被 m 整除,或者 sum / m < n, ...

  6. 贪心 HDOJ 5355 Cake

    好的,数据加强了,wa了 题目传送门 /* 题意:1到n分成m组,每组和相等 贪心:先判断明显不符合的情况,否则肯定有解(可能数据弱?).贪心的思路是按照当前的最大值来取 如果最大值大于所需要的数字, ...

  7. hdu 5535 Cake 构造+记忆化搜索

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...

  8. hdoj 5355 Cake(分析+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕 #include<s ...

  9. hdu 1722 Cake 数学yy

    题链:http://acm.hdu.edu.cn/showproblem.php? pid=1722 Cake Time Limit: 1000/1000 MS (Java/Others)    Me ...

随机推荐

  1. 96.extjs 页面

    1.登录js /** * @author sux * @desc 登录 */ Ext.onReady(function(){ Ext.QuickTips.init(); //错误信息显示必须 var ...

  2. C# List常识之经常被忽略的常识

    最近在接收前辈的代码,越来越会发现有很多.net已经封装好的方法可以使用,我们却不知道,然后自己去For/Foreach循环解决自己的需求问题 总的来说:当下很忧伤啊.总结了几个经常需要用却不知道的方 ...

  3. 昂贵的聘礼(Dijkstra)

    http://poj.org/problem?id=1062 每个物品看成一个节点,酋长的允诺也看作一个物品, 如果一个物品加上金币可以交换另一个物品,则这两个节点之间有边,权值为金币数,求第一个节点 ...

  4. html5 窗口之间的通信

    一般窗口通信分为三种: iframe嵌套:多个iframe之间通信. 父页面操作子页面元素:oFrame.contentWindow.document.body. 父页面调用子页面方法:oFrame. ...

  5. EF6 自定义迁移表名

    在下列代码片段中已经EF6迁移表的表名更改为 MigrationHistory注意:下代码片段建议和DbContext同程序集 public class ModelConfiguration : Db ...

  6. ROS-URDF-Xacro

    前言:Xacro是一种宏语言,允许代码复用,使用Xacro可以减少URDF文件中的代码量. 参考自:http://wiki.ros.org/urdf/Tutorials/Using%20Xacro%2 ...

  7. ACM_Exponentiation

    Exponentiation Time Limit: 2000/1000ms (Java/Others) Problem Description: Problems involving the com ...

  8. ie9长度兼容

    onchange="this.value=this.value.substring(0, 10)" onkeydown="this.value=this.value.su ...

  9. asp.net ajax 简单案例

    第一步先引用 scriptManager <asp:UpdatePanel ID="UpdatePanelGuanZhu" runat="server"& ...

  10. 推荐几个好用的windows软件

    好久没上了,= = 之前用了一段MAC,感觉好用的地方就是 spotlight和触摸板,哈哈 然后在用回windows之后就找了一下,我之前有用Launchy这个软件,但是他是用来启动程序的,当然你也 ...