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

我们都不须要搜索了

就这样这个问题就攻克了

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<vector>
  6. #define maxn 100005
  7. #define ll __int64
  8. #define cnm c[nu][m]
  9. using namespace std;
  10. int v[15][maxn];
  11. ll m,n;
  12. //fun函数定义将1-num平均分给l-r个人
  13. int a[15][50];
  14. int si[15];
  15. bool b[50];
  16. int dp[50][10]={0};
  17. int c[50][10][15][50]={0};
  18. ll ave,nu;
  19. bool dfs(int sum,int g,int s){
  20. if(sum==ave){g++;sum=0;s=1;}
  21. if(g==m-1){
  22. for(int i=1;i<=nu;i++)
  23. if(!b[i])a[g][++a[g][0]]=i;
  24. return true;
  25. }
  26. for(int i=s;i<=nu;i++){
  27. if(sum+i>ave) return false;
  28. if(!b[i]){
  29. b[i]=true;
  30. a[g][++a[g][0]]=i;
  31. if(dfs(sum+i,g,i+1)) return true;
  32. b[i]=false;
  33. a[g][0]--;
  34. }
  35. }
  36. return false;
  37. }
  38.  
  39. bool fun(ll num){
  40. if(num>=4*m-1){
  41. for(int i=0,j=0;i<m;i++,j++){
  42. v[i][si[i]++]=num-j;
  43. v[i][si[i]++]=num-2*m+1+j;
  44. }
  45. return fun(num-2*m);
  46. }
  47. else {
  48. nu=num;
  49. ave=(num+1)*num/2/m;
  50. int b;
  51. if(dp[num][m]==0){
  52. if(dfs(0,0,1)){
  53. dp[num][m]=1;
  54. for(int i=0;i<m;i++)
  55. for(int j=0;j<=a[i][0];j++)
  56. cnm[i][j]=a[i][j];
  57. }
  58. else dp[num][m]=-1;
  59. }
  60. if(dp[nu][m]==1) return true;
  61. return false;
  62. }
  63. }
  64. void out(int n){
  65. printf("YES\n");
  66. for(int i=0;i<n;i++){
  67. printf("%d",si[i]+cnm[i][0]);
  68. for(int j=0;j<si[i];j++) printf(" %d",v[i][j]);
  69. for(int j=0;j<cnm[i][0];j++) printf(" %d",cnm[i][j+1]);
  70. printf("\n");
  71. }
  72. }
  73. void Init(){
  74. memset(si,0,sizeof(si));
  75. memset(a,0,sizeof(a));
  76. memset(b,0,sizeof(b));
  77. }
  78. int main(){
  79. int T;
  80. scanf("%d",&T);
  81. while(T--){
  82. scanf("%I64d%I64d",&n,&m);
  83. ll su=n*(n+1)/2;
  84. ll av=su/m;
  85. if(su%m||av<n)printf("NO\n");
  86. else{
  87. Init();
  88. bool ok=fun(n);
  89. if(ok)out(m);
  90. else printf("NO\n");
  91. }
  92. }
  93. return 0;
  94. }

/*

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

待更新……

*/

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

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<vector>
  6. #define maxn 100005
  7. #define ll __int64
  8. using namespace std;
  9. int a[maxn];
  10. vector <int > v[maxn];
  11. int main(){
  12. int T;
  13. scanf("%d",&T);
  14. while(T--){
  15. ll n,m;
  16. scanf("%I64d%I64d",&n,&m);
  17. ll sum =(n+1)*n/2;
  18. if(sum%m==0){
  19. ll ave=sum/m;
  20. if(ave<n)
  21. printf("NO\n");
  22. else{
  23. memset(v,0,sizeof(v));
  24. memset(a,0,sizeof(a));
  25. int t=ave,A=0;
  26. int flag=0;
  27. for(int i=n;!flag&&i>=1;i--){
  28. if(a[i]==0){
  29. t-=i;
  30. v[A].push_back(i);
  31. a[i]=1;
  32. }
  33. if(i-1>t){
  34. for(int j=i-1;t&&j>=1;j--){
  35. if(t>=j&&a[j]==0){
  36. v[A].push_back(j);
  37. t-=j;
  38. a[j]=1;
  39. }
  40. }
  41. }
  42. if(t==0){
  43. t=ave;
  44. A++;
  45. }
  46. }
  47. if(A==m){
  48. printf("YES\n");
  49. for(int i=0;i<m;i++){
  50. printf("%d",v[i].size());
  51. for(int j=0;j<v[i].size();j++)
  52. printf(" %d",v[i][j]);
  53. printf("\n");
  54. }
  55. }
  56. else
  57. printf("NO\n");
  58. }
  59. }
  60. else
  61. printf("NO\n");
  62. }
  63. return 0;
  64. }

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. bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛(状压dp)

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1032  Solved: 588[ ...

  2. AOP实现参数的判空问题

    不想每次都去判断必传的参数是否为空,写代码太繁琐了,正好最近用了AOP实现权限控制,依葫芦画瓢,现在用它实现参数的判空,至于AOP的原理之类,自己百度了解一下吧 1. NullDisable注解 @D ...

  3. lua 10进制转换成其它进制table表示

    -- params@num integer -- ~) 默认为10 -- NOTE:先不输出符号 function NumberToArray(num, radix) if type(num) ~= ...

  4. 【JAVA练习】- 给定精度求圆周率π

    给定一个精度求圆周率π的近似值 给定公式:π/4=1-1/3+1/5-1/7+1/9-... public static void main(String[] args) { System.out.p ...

  5. DeltaFish 校园物资共享平台 第一次小组会议

    软工小组第一次会议 会议地点:图书馆 会议时间:19:00 ~ 20:00 与会人员:软工小组全体成员 请假人员:无缺席人员:无 记录人:陈志锴 整理人:曾子轩 会议记录 一.确认选题 每一位成员提出 ...

  6. 浅谈Java三大框架与应用

    前言:对于一个程序员来说,尤其是在java web端开发的程序员,三大框架:Struts+Hibernate+Spring是必须要掌握熟透的,因此,下面谈谈java三大框架的基本概念和原理. JAVA ...

  7. 极客学院免费VIP

    [手快福利]用我的链接注册极客学院,你我都能免费得30天VIP!6500+编程开发视频教程随便学,还能下载资料和源码 http://e.jikexueyuan.com/invite/index.htm ...

  8. 揭开jQuery的面纱

    简单地说,jQuery是一个优秀的JavaScript类库,也就是使用JavaScript面向对象的性质编写的一个JavaScript类的集合.jQuery究竟能为我们提供哪些功能呢?简单地说可以从七 ...

  9. 如何安全使用dispatch_sync

    概述 iOS开发者在与线程打交道的方式中,使用最多的应该就是GCD框架了,没有之一.GCD将繁琐的线程抽象为了一个个队列,让开发者极易理解和使用.但其实队列的底层,依然是利用线程实现的,同样会有死锁的 ...

  10. vue货币格式化组件、局部过滤功能以及全局过滤功能

    一.在这里介绍一个vue的时间格式化插件: moment 使用方法: .npm install moment --save. 2 定义时间格式化全局过滤器 在main.js中 导入组件 import ...