Stick ------ 剪枝神题
这个是自己剪得 , 我感觉已经很不错了 但是不知道哪里出了问题 一直 超时
- // 根据所给答案 和 题目要求 最直观的就可以有剪枝的地方 而且 剪枝剪得越早 就越省时省力
- // 好的思路也可以省不少的时间
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #include<set>
- #include<stack>
- #include<string>
- #include<sstream>
- #include<map>
- #include<cctype>
- using namespace std;
- bool cmp(int a,int b)
- {
- return a>b;
- }
- int a[],goal,visited[],mark,result,sum,n,flag;
- void DFS_check() // 我感觉 前面的两个剪枝 就十分的强悍了 但是鉴于 这一道题 比较的 变态 所以 继续剪枝!
- {
- if(flag)
- return ;
- if(goal>result)
- return ;
- if(goal==result) // 加上了最后一个数字 这时候 mark 也刚刚好 所以 这个放上面
- {
- mark++;
- goal=; // 攒够 一套之后 就直接让 计数器归零
- }
- if(mark*result==sum)// 这时候 是 刚好符合条件 // 这个值 不可能大于 sum
- {
- flag=;
- }
- for(int i=;i<n;i++)
- {
- if(!visited[i]) // 没有被访问过
- {
- visited[i]=;
- goal+=a[i];
- DFS_check();
- goal-=a[i];
- visited[i]=;
- while(a[i]==a[i+])
- i++;
- }
- }
- if(flag)
- return ;
- }
- int main()
- {
- while(scanf("%d",&n),n)
- {
- result=sum=;
- for(int i=;i<n;i++)
- {
- scanf("%d",&a[i]);
- sum+=a[i];
- }
- sort(a,a+n,cmp); // 将 碎木棒长度 从大到小排序之后 1 :方便操作 2 :在找出答案之后 可以很快的退出 寻找 ,能省不少的时间
- int len=(sum/)+;
- for(int i=a[];i<=len;i++) // 一个剪枝 , 这个估计能省去 理论上一半的时间 的时间
- {
- if(sum%i!=) // 这里的 i 是假设的 原始木棒长度 // 如果总长度 不能被假设木棒长度整除的话 , 这个假设就是不成立的 .
- continue;
- memset(visited,,sizeof(visited));
- flag=goal=mark=;
- result=i;
- DFS_check();
- if(flag) // 检查 该长度 是否 是 最小的木棒长度
- {
- result=i; //更新最小木棒长度
- break;
- }
- }
- if(result==)
- result=sum;
- printf("%d\n",result);
- }
- return ;
- }
下面附上正确答案
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #include<set>
- #include<stack>
- #include<string>
- #include<sstream>
- #include<map>
- #include<cctype>
- using namespace std;
- int n,sum,a[],goal,visited[];
- bool cmp(int a,int b)
- {
- return a>b;
- }
- bool DFS(int now,int index,int mark,int goal) // mark 已集齐的 原始木棒数量 goal 假设原始木棒长度
- {
- if(mark*goal==sum)
- return true;
- for(int i=index;i<n;i++)
- {
- if(visited[i]||(a[i]==a[i-]&&!visited[i-])) //如果这一个节点 已经 被用了 就不再用了 //如果这个节点和上一个节点相同 并且上一个节点 没有被使用 那么这个节点就也不会被使用了
- continue; // 因为 出现这种情况 的原因只有一种就是 + 这个数值 now 大于了 目标值
- if(now+a[i]==goal)
- {
- visited[i]=;
- if(DFS(,,mark+,goal))
- return true;
- visited[i]=;
- return false;
- }
- else
- if(now+a[i]<goal)
- {
- visited[i]=;
- if(DFS(now+a[i],i+,mark,goal)) // 在已经确定了一个比较大的值之后 继续向后面寻找比较小的值
- return true;
- visited[i]=;
- if(now==)
- return false;
- }
- }
- return false;
- }
- int main()
- {
- while(scanf("%d",&n) == && n)
- {
- int i;
- for(i=sum=;i<n;i++)
- {
- scanf("%d",&a[i]);
- sum+=a[i];
- }
- sort(a,a+n,cmp);
- for(i=a[];i<sum;i++)// 开始从最长的假设
- {
- if(sum%i) //如果不能整除的话 那一定不是 原始 平均长度
- continue;
- memset(visited,,sizeof(visited));
- if(DFS(,,,i))
- {
- printf("%d\n",i);
- break;
- }
- }
- if(i==sum)
- printf("%d\n",sum);
- }
- return ;
- }
Stick ------ 剪枝神题的更多相关文章
- poj 1011 Sticks ,剪枝神题
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...
- POJ 2484 A Funny Game(神题!)
一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...
- BUAA 724 晴天小猪的神题(RMQ线段树)
BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- 【CF913F】Strongly Connected Tournament 概率神题
[CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...
- [agc007f] Shik and Copying String 模拟神题
Description "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...
- AtCoder 神题汇总
记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...
- hdoj5821【贪心-神题】
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...
- [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)
4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 629 Solved: 371[Submit][Status ...
随机推荐
- cad二次开发中各种头的定义
Database db=HostApplicationServices.WrokingDatabase; Editor ed=Autodesk.AutoCAD.ApplicationService.A ...
- table头部固定,内容滚动
可以设置两个table,th,td得设置宽度: <table> <thead> <tr><th></th&g ...
- CPU 指令集(Instruction Set Architecture, ISA)
本文摘自网络 概念 指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序,用来引导CPU进行加减运算和控制计算机操作系统的一系列指令集合.拥有这些指令集,CPU就可以更高效地运行.系统所下达的 ...
- Java数值数学类
Java数值数学类 序号 方法与描述 1 xxxValue() 将 Number 对象转换为xxx数据类型的值并返回. 2 compareTo() 将number对象与参数比较. 3 equals ...
- NOIWC2019 冬眠记
冬眠 由于THUWC考太差了没啥心情做事…… Day -1 报到日前一天晚上去看了看宿舍表,发现周围全是集训队,隔壁就是栋爷.高队和lca,再隔壁是zzq和wxh……吓傻了(本校buff这么好吗) D ...
- ORM 事务
orm 事务: import datetime from appxx import models try: from django.db import transaction with transac ...
- mysql命令整理
MySQL大小写通用. 一.常见用的mysql指令 1.show databases; #查看当前所有库 2.show tables; #查看所在库中的所有表 3.use 库名; #进入该库 4.sh ...
- jquery 插件封装模板
//插件编写模板 ;(function ($) { $.fn.plugIn = function ( opt ) { var def = { //这里填写自定义的参数例如: event : 'clic ...
- GlobalSign 多域型(SNAs) SSL 证书
GlobalSign 多域型(SNAs) SSL 证书 GlobalSign 多域型(SNAs) SSL 证书,有别于通配符 SSL 证书可以同时保护一个域名下所有的子域名网站,SANs 证书更进一步 ...
- Java基础学习总结(36)——Java注释模板
代码注释是对代码设计者.代码阅读者以及系统间调用提供了有效的帮助,最大限度的提高团队开发合作效率增强系统的可维护性.我们追求简化,不是为了写注释而写注释. (快速使用请直接看六.七.八) 一.原则: ...