蜥蜴和地下室

来源:互联网 发布:linux shell 判断大小 编辑:程序博客网 时间:2024/04/29 18:48

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1489

从解空间里面找到最小的

#include<cstdio>#include<algorithm>#include<cstring>typedef long long ll;using namespace std;int val[20];int n,a,b;const int INF=0x3f3f3f3f;int ans2=INF;void dfs(int now,int cnt){if(now==n){ans2=min(ans2,cnt);return;}if(val[now-1]<0){ //就是说如果当移动条件已经满足,我们可以直接走,当然,也可以不走 dfs(now+1,cnt);}    int t1=0;if(val[now-1]>=0){t1=val[now-1]/b+1;val[now-1]-=t1*b;val[now]  -=t1*a;val[now+1]-=t1*b;dfs(now+1,cnt+t1);val[now-1]+=t1*b;val[now]  +=t1*a;val[now+1]+=t1*b;}   if(val[now]>=0){int t2=val[now]/a+1;if(t2>t1){for(int i=t1+1;i<=t2;i++){val[now-1]-=i*b;val[now]  -=i*a;val[now+1]-=i*b;dfs(now+1,cnt+i);val[now-1]+=i*b;val[now]  +=i*a;val[now+1]+=i*b;}}  }}int main(){scanf("%d %d %d",&n,&a,&b);for(int i=1;i<=n;i++)scanf("%d",&val[i]);int ans1=0;while(val[1]>=0){val[1]-=b;val[2]-=a;val[3]-=b;ans1++;}if(n>3){while(val[n]>=0){val[n]-=b;val[n-1]-=a;val[n-2]-=b;ans1++;}}dfs(2,0);if(ans2==INF)   ans2=0;printf("%d\n",ans1+ans2);return 0;}


原创粉丝点击