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 ...
随机推荐
- win10系统安装postgresql后无法连接
win10系统安装postgresql后在系统服务列表中找不到,连接不上数据库. 可以尝试关闭系统防火墙后重启电脑或者重装程序.
- CAD在网页中打印的图纸里面添加页眉及页脚
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- js案例分析
名字取的高大上,其实只是我平时上网浏览遇到的一些我感觉还不错的小题目,再加上我或者是我在网上找到的一些理解,就保存到这里了. 2019/4/2 最新开了个新坑,是一个javascipt30的一些案例 ...
- PAT_A1107#Social Clusters
Source: PAT A1107 Social Clusters (30 分) Description: When register on a social network, you are alw ...
- uva 1583 Digit Generator(Uva-1583)
题目不再写入了,vj:https://vjudge.net/problem/UVA-1583#author=0 主要讲的是找一个数的小于它的一个数,小于它的那个数每一位加起来再加上那个数就会等于原来的 ...
- clock()函数的使用
**clock()捕捉从程序开始运行到clock()被调用时所耗费的时间,这个时间单位是clock tick, 即"时钟打点." 常数CLK_TCK:机器时钟每秒所走的时钟打点数* ...
- PAT 1091. Acute Stroke (bfs)
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...
- Django——7 常用的查询 常用的模型字段类型 Field的常用参数 表关系的实现
Django 常用的查询 常用的查询方法 常用的查询条件 常用字段映射关系 Field常用参数 表关系的实现 查用的查询方法 这是需要用到的数据 from django.http import Htt ...
- CSVHelper在Asp.Net MVC中的使用
1,从数据库读取数据,然后导出CSV文件 [HttpPost] public FileResult ExportCSV() { var apps =....//linq以及EF从数据库查询数据 Mem ...
- 【ACM】poj_1579_Function Run Fun_201308121654
Function Run FunTime Limit: 1000MS Memory Limit: 10000K Total Submissions: 14940 Accepted: 7736 De ...