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 ...
随机推荐
- 扩增子图表解读5火山图:差异OTU的数量及变化规律
火山图 Volcano plot 在统计学上,火山图是一种类型的散点图,被用于在大数据中快速鉴定变化.由于它的形成像火山喷发的样子,所以被称为火山图.和上文讲的曼哈顿图类似. 火山图基本元素 火山 ...
- CI框架3.x 之实现前后端分离
一.建立合理的目录结构 admin与home为后台和前台的控制器和模板文件夹 二.定义前后台视图路径常量 在constants.php中添加如下代码: //定义前台视图路径常量 define('HOM ...
- scp: /xxxx: not a regular file
问题描述 scp root@10.2.1.92:/home /home/wangju/databakroot@10.2.1.92's password: xxxxscp: /home: not a r ...
- apache配置多域名二级域名
nginx配置多域名泛解析的看这个链接:https://www.cnblogs.com/Crazy-Liu/p/10879740.html 下面直接来操作: [root@localhost ~]# f ...
- 原型链、构造函数、箭头函数、se6数组去重
原型链 例子如下: var arr = [1, 2, 3]; 其原型链为:arr ----> Array.prototype ----> Object.prototype ----> ...
- enote笔记语言(5)——其他
章节:其他 ((主:单词)) 用来醒目地强调这个句子中哪个词语作主语 sentence: ...
- Secret of Chocolate Poles (Aizu1378——dp)
Select Of Chocolate Poles 题意:有一个竖直放置的高度为l cm的盒子,现在有三种方块分别为1cm的白块,1cm的黑块,k cm的黑块,要求第一块放进去的必须是黑色的,盒子最上 ...
- JavaScript学习笔记之DOM介绍
目录 1.简介 2.方法 3.属性 4.访问节点 5.修改节点 6.添加节点 7.删除节点 8.替换节点 9.改变 CSS 1.简介 文档对象模型(Document Object Model,DOM) ...
- IDEA 工具使用报错总结
读前语:此文章仅给非入门级观看 1.使用Debug 无法运行,而使用Run 则正常启动,报错代码如下 1 Error running 'jx_web': Unable to open debugge ...
- hdu_1013_Digital Roots_201310121652
Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...