好久以前抄的題解,現在重新抄題解做一下


1.對所有木棍從大到小排序,後用小的比較靈活

2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根

3.預處理出重複木棍的位置,防止重複搜索相同的木棍

4.二分查找下一根小於等於未拼木棍長度的木棍

5.因為是從小到大枚舉原木棍長度,所以第一次找到可行解就是最優的,直接停止

6.如果當前選擇木棍長度等於當前未拼木棍的長度,並且繼續搜索失敗時,就不再搜了

因為如果不用這根拼的話必然要拿更小的幾根木棍拼好當前未拼的長度,

而晚用長木棍早用短木棍只會更加不靈活,一定不會更優(最好情況下也是等價的)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[],v[],nxt[],sum,cnt,len,flag;
void dfs(int k,int las,int res){//k正在拼的木棍編號
//last所用上一節的編號,res當前剩餘未拼長度
int i;
if(!res){//這跟拼完
if(k==m){flag=;return;}//5.全部拼完立即退出
for(i=;i<=cnt;i++)
if(!v[i])break;
v[i]=;
dfs(k+,i,len-a[i]);
v[i]=;
if(flag)return;//6.
}
int l=las+,r=cnt,mid;
while(l<r){//4.二分找下一根木棍
mid=(l+r)>>;
if(a[mid]<=res)r=mid;
else l=mid+;
}
for(int i=l;i<=cnt;i++){
if(!v[i]){
v[i]=;
dfs(k,i,res-a[i]);
v[i]=;
if(flag)return;
if(res==a[i] || res==len)return;//6.上面沒有return,組合失敗,這裡return
i=nxt[i];//3.重複的長度不搜索
if(i==cnt)return;
}
}
}
bool cmp(int a,int b){return a>b;}
int main()
{
scanf("%d",&n);
for(int i=,d;i<=n;i++){
scanf("%d",&d);
if(d<=)a[++cnt]=d,sum+=d;
}
sort(a+,a+cnt+,cmp);//1.
nxt[cnt]=cnt;
for(int i=cnt-;i>=;i--){
if(a[i]==a[i+])nxt[i]=nxt[i+];
else nxt[i]=i;
}
for(len=a[];len<=sum/;len++){
if(sum%len!=)continue;//不能整除跳過(顯然
m=sum/len;//5.
flag=;
v[]=;
dfs(,,len-a[]);
v[]=;
if(flag){
printf("%d\n",len);return ;//5.
}
}
printf("%d\n",sum);
}

[題解]luogu_P1120小木棍(搜索)的更多相关文章

  1. 洛谷P1120 小木棍 [搜索]

    题目传送门 题目描述乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍 ...

  2. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  3. 洛谷P1120 小木棍 [数据加强版](搜索)

    洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...

  4. 洛谷P1120 小木棍

    洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长 ...

  5. P1120 小木棍 [数据加强版] 回溯法 终极剪枝

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度 ...

  6. 洛谷 P1120 小木棍 [数据加强版]解题报告

    P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...

  7. 题解 P1120 【小木棍 [数据加强版]】

    题面 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮 ...

  8. P1120 小木棍 [数据加强版]

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  9. P1120 小木棍 [数据加强版](poj 1011)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

随机推荐

  1. failed to load AppCompat ActionBar with unkNown error

    解决办法: 在AndroidManifest.xml文件中找到 全局样式文件 Theme,如图: 进入到这个文件,在前面增加 "Base".,如图:

  2. signal( SIGINT, SigIntHandler )

    signal 的第1个参数signum表示要捕捉的信号,第2个参数是个函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DEF(表示交由系统缺省处理,相当于白注册了)或SIG_IGN(表示 ...

  3. Vue实例和方法

    github地址:https://github.com/manlili/vue_learn里面的lesson03 一 实例 每个 Vue 实例都会代理其 data 对象里所有的属性,改变data,vu ...

  4. 关于Zookeeper

    Zookeeper是分布式协调工具 应用场景 命名服务(注册中心) Dubbo注册中心 分布式配置中心(SpringCloud config)动态管理配置文件信息 消息中间件 事件通知(类似发布订阅) ...

  5. discuz邮箱注册激活||腾讯企业邮箱免费注册及登录方法

    如何申请免费的企业邮箱,如果拥有了网站,还能有一个免费的域名邮箱,是不是很拉风呢?对于还没有注册企业的用户来说,优先使用企业邮箱,是非常好的事呢. 腾讯邮箱现在开放免费的企业邮箱注册,效果要比个人邮箱 ...

  6. 整合kxmovie

    下载后发现kxmovie 直接运行是不通的,上面我们已经处理了ffmpeg部分的内容.当然了先处理ffmpeg部分.然后再复制kxmovie/kxmovie到项目中导入相应的文件. 编译报错:UIim ...

  7. postNotificationName 消息传递详解

      1.定义消息创建的关联值 也就是找到方法的标志 NSString *const GameToIPhoneNotification = @"GameToIPhoneNotification ...

  8. codeforces 31C Schedule 解题报告

    题目链接:http://codeforces.com/problemset/problem/31/C 题目意思:给出 n 个 lessons 你,每个lesson 有对应的 起始和结束时间.问通过删除 ...

  9. codeforces A. Black-and-White Cube 解题报告

    题目链接:http://codeforces.com/problemset/problem/323/A 题目意思:给定值 k ,需要输出 k 个 k 行 k 列的单位立方体各表示什么颜色(或者是黑色或 ...

  10. the art of seo(chapter one)

    preface:Andy Johns (@ibringtraffic):growth strategist@Wealthfront ***1.Search Reflecting Consciousne ...