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

//  根据所给答案 和 题目要求 最直观的就可以有剪枝的地方 而且 剪枝剪得越早 就越省时省力
// 好的思路也可以省不少的时间
#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 ------ 剪枝神题的更多相关文章

  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. Django中图片的上传并显示

    一.settings配置文件中配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace('\\', ...

  2. dotfuscator 如何设置

  3. SpringMVC注解配置处理器映射器和处理器适配器

    一.springmvc.xml中配置方式 <!--注解映射器 --> <bean class="org.springframework.web.servlet.mvc.me ...

  4. 模态框(layer)

    推荐一个好看的模态框(layer)   地址:http://layer.layui.com/ 相应列子及配置  全部来自于官网,可直接访问官网学习了解. //信息框-例1 layer.alert('见 ...

  5. git clone下载代码,中途断掉怎么办?

    问题如下: 解决办法: 1)运行以下命令进行clone $ git clone --recursive https:xxxxxx 2)进入项目根目录,继续下载 $ cd eigen-git-mirro ...

  6. BZOJ 1572 USACO 2009 Open 工作安排

    先把工作按照Deadline从小到大排序 然后按顺序取,deadline大于现在总用时就取,等于现在总用时就从前面已取的工作中找一个P最小的同它比较,取P较大的一个 用优先队列维护已取工作中P的最小值 ...

  7. 【codeforces 801D】Volatile Kite

    [题目链接]:http://codeforces.com/contest/801/problem/D [题意] 给你一个凸多边形的n个点; 然后允许你将每个点移动到距离不超过D的范围内; 要求无论如何 ...

  8. MySQL的limit用法及优化(转)

    常规用法: 用法一: OFFSET ; 比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. 用法二: ,; 而这个SQL,limit后面是从第2条开始读,读取1条信息 ...

  9. insert into varchar2(8000)

    在看12c的文档的时候发现varcahr2最大长度是4000 byte VARCHAR2 Data Type The VARCHAR2 data type specifies a variable-l ...

  10. [Tools] Using colours in a NodeJS terminal - make your output pop

    Use can use colour and styles to make it easy to spot errors and group common functionality into blo ...