这个是自己剪得 , 我感觉已经很不错了  但是不知道哪里出了问题  一直  超时

  1. // 根据所给答案 和 题目要求 最直观的就可以有剪枝的地方 而且 剪枝剪得越早 就越省时省力
  2. // 好的思路也可以省不少的时间
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<math.h>
  6. #include<iostream>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<vector>
  10. #include<set>
  11. #include<stack>
  12. #include<string>
  13. #include<sstream>
  14. #include<map>
  15. #include<cctype>
  16. using namespace std;
  17. bool cmp(int a,int b)
  18. {
  19. return a>b;
  20. }
  21. int a[],goal,visited[],mark,result,sum,n,flag;
  22. void DFS_check() // 我感觉 前面的两个剪枝 就十分的强悍了 但是鉴于 这一道题 比较的 变态 所以 继续剪枝!
  23. {
  24. if(flag)
  25. return ;
  26. if(goal>result)
  27. return ;
  28. if(goal==result) // 加上了最后一个数字 这时候 mark 也刚刚好 所以 这个放上面
  29. {
  30. mark++;
  31. goal=; // 攒够 一套之后 就直接让 计数器归零
  32. }
  33. if(mark*result==sum)// 这时候 是 刚好符合条件 // 这个值 不可能大于 sum
  34. {
  35. flag=;
  36. }
  37. for(int i=;i<n;i++)
  38. {
  39. if(!visited[i]) // 没有被访问过
  40. {
  41. visited[i]=;
  42. goal+=a[i];
  43. DFS_check();
  44. goal-=a[i];
  45. visited[i]=;
  46. while(a[i]==a[i+])
  47. i++;
  48. }
  49. }
  50.  
  51. if(flag)
  52. return ;
  53. }
  54. int main()
  55. {
  56. while(scanf("%d",&n),n)
  57. {
  58. result=sum=;
  59. for(int i=;i<n;i++)
  60. {
  61. scanf("%d",&a[i]);
  62. sum+=a[i];
  63. }
  64. sort(a,a+n,cmp); // 将 碎木棒长度 从大到小排序之后 1 :方便操作 2 :在找出答案之后 可以很快的退出 寻找 ,能省不少的时间
  65. int len=(sum/)+;
  66. for(int i=a[];i<=len;i++) // 一个剪枝 , 这个估计能省去 理论上一半的时间 的时间
  67. {
  68. if(sum%i!=) // 这里的 i 是假设的 原始木棒长度 // 如果总长度 不能被假设木棒长度整除的话 , 这个假设就是不成立的 .
  69. continue;
  70. memset(visited,,sizeof(visited));
  71. flag=goal=mark=;
  72. result=i;
  73. DFS_check();
  74. if(flag) // 检查 该长度 是否 是 最小的木棒长度
  75. {
  76. result=i; //更新最小木棒长度
  77. break;
  78. }
  79. }
  80. if(result==)
  81. result=sum;
  82. printf("%d\n",result);
  83. }
  84. return ;
  85. }

下面附上正确答案

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<vector>
  8. #include<set>
  9. #include<stack>
  10. #include<string>
  11. #include<sstream>
  12. #include<map>
  13. #include<cctype>
  14. using namespace std;
  15. int n,sum,a[],goal,visited[];
  16. bool cmp(int a,int b)
  17. {
  18. return a>b;
  19. }
  20. bool DFS(int now,int index,int mark,int goal) // mark 已集齐的 原始木棒数量 goal 假设原始木棒长度
  21. {
  22. if(mark*goal==sum)
  23. return true;
  24. for(int i=index;i<n;i++)
  25. {
  26. if(visited[i]||(a[i]==a[i-]&&!visited[i-])) //如果这一个节点 已经 被用了 就不再用了 //如果这个节点和上一个节点相同 并且上一个节点 没有被使用 那么这个节点就也不会被使用了
  27. continue; // 因为 出现这种情况 的原因只有一种就是 + 这个数值 now 大于了 目标值
  28. if(now+a[i]==goal)
  29. {
  30. visited[i]=;
  31. if(DFS(,,mark+,goal))
  32. return true;
  33. visited[i]=;
  34. return false;
  35. }
  36. else
  37. if(now+a[i]<goal)
  38. {
  39. visited[i]=;
  40. if(DFS(now+a[i],i+,mark,goal)) // 在已经确定了一个比较大的值之后 继续向后面寻找比较小的值
  41. return true;
  42. visited[i]=;
  43. if(now==)
  44. return false;
  45. }
  46. }
  47. return false;
  48. }
  49. int main()
  50. {
  51. while(scanf("%d",&n) == && n)
  52. {
  53. int i;
  54. for(i=sum=;i<n;i++)
  55. {
  56. scanf("%d",&a[i]);
  57. sum+=a[i];
  58. }
  59. sort(a,a+n,cmp);
  60. for(i=a[];i<sum;i++)// 开始从最长的假设
  61. {
  62. if(sum%i) //如果不能整除的话 那一定不是 原始 平均长度
  63. continue;
  64. memset(visited,,sizeof(visited));
  65. if(DFS(,,,i))
  66. {
  67. printf("%d\n",i);
  68. break;
  69. }
  70. }
  71. if(i==sum)
  72. printf("%d\n",sum);
  73. }
  74. return ;
  75. }

Stick ------ 剪枝神题的更多相关文章

  1. poj 1011 Sticks ,剪枝神题

    木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...

  2. POJ 2484 A Funny Game(神题!)

    一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...

  3. BUAA 724 晴天小猪的神题(RMQ线段树)

    BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...

  4. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...

  5. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  6. [agc007f] Shik and Copying String 模拟神题

    Description ​ "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...

  7. AtCoder 神题汇总

    记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...

  8. hdoj5821【贪心-神题】

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...

  9. [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 629  Solved: 371[Submit][Status ...

随机推荐

  1. cad二次开发中各种头的定义

    Database db=HostApplicationServices.WrokingDatabase; Editor ed=Autodesk.AutoCAD.ApplicationService.A ...

  2. table头部固定,内容滚动

    可以设置两个table,th,td得设置宽度:     <table>       <thead>          <tr><th></th&g ...

  3. CPU 指令集(Instruction Set Architecture, ISA)

    本文摘自网络 概念 指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序,用来引导CPU进行加减运算和控制计算机操作系统的一系列指令集合.拥有这些指令集,CPU就可以更高效地运行.系统所下达的 ...

  4. Java数值数学类

    Java数值数学类 序号 方法与描述 1 xxxValue()  将 Number 对象转换为xxx数据类型的值并返回. 2 compareTo()  将number对象与参数比较. 3 equals ...

  5. NOIWC2019 冬眠记

    冬眠 由于THUWC考太差了没啥心情做事…… Day -1 报到日前一天晚上去看了看宿舍表,发现周围全是集训队,隔壁就是栋爷.高队和lca,再隔壁是zzq和wxh……吓傻了(本校buff这么好吗) D ...

  6. ORM 事务

    orm 事务: import datetime from appxx import models try: from django.db import transaction with transac ...

  7. mysql命令整理

    MySQL大小写通用. 一.常见用的mysql指令 1.show databases; #查看当前所有库 2.show tables; #查看所在库中的所有表 3.use 库名; #进入该库 4.sh ...

  8. jquery 插件封装模板

    //插件编写模板 ;(function ($) { $.fn.plugIn = function ( opt ) { var def = { //这里填写自定义的参数例如: event : 'clic ...

  9. GlobalSign 多域型(SNAs) SSL 证书

    GlobalSign 多域型(SNAs) SSL 证书 GlobalSign 多域型(SNAs) SSL 证书,有别于通配符 SSL 证书可以同时保护一个域名下所有的子域名网站,SANs 证书更进一步 ...

  10. Java基础学习总结(36)——Java注释模板

    代码注释是对代码设计者.代码阅读者以及系统间调用提供了有效的帮助,最大限度的提高团队开发合作效率增强系统的可维护性.我们追求简化,不是为了写注释而写注释. (快速使用请直接看六.七.八) 一.原则: ...