51Nod 1489 蜥蜴和地下室
2018-01-11 12:08
211 查看
这道题 一开始想的是贪心 但是想歪了 每次打对伤害总体贡献最大的一个 因为小数据 所以随便怎么搞 然后 WA了几发 又想到小数据枚举还能有什么 于是dfs搜索… …
这道我想的是枚举搜索路径 因为能对当前Loc位置产生伤害只能有三个位置Loc-1,Loc,Loc+1 所以在打后面的敌人之前 可以把他前面的两个位置及之前敌人打掉
综上所述 如果要打掉当前位置的敌人 要么是打他前面位置的敌人 顺手打掉的
要么是就打他这个位置 要么在打他后面那个位置的敌人 一定要打掉的
所以 代码如下
#include<iostream> #include<cstring> using namespace std; const int INF = 0x3f3f3f; int life[20]; int n,a,b; int ans; void dfs(int time,int loc){ if(loc==n) { ans = min(ans,time); return; } if(life[loc-1]<0) dfs(time,loc+1); int t=0; if(life[loc-1]>=0) { t+=life[loc-1]/b+1; life[loc]-=t*a; life[loc+1]-=t*b; dfs(time+t,loc+1); life[loc]+=t*a; life[loc+1]+=t*b; } int times = life[loc]/a+1; if(life[loc]>=0 && t<=times){ for(int i=t+1;i<=times;i++){ life[loc]-=i*a; life[loc+1]-=i*b; dfs(time+i,loc+1); life[loc]+=i*a; life[loc+1]+=i*b; } } return; } int main(){ cin >> n >> a >> b; for(int i=0;i<n;i++) cin >> life[i]; ans = 500; int start=0; while(life[0]>=0){ life[0]-=b; life[1]-=a; life[2]-=b; start++; } while(life[n-1]>=0){ life[n-1]-=b; life[n-2]-=a; life[n-3]-=b; start++; } dfs(start,1); cout << ans << endl; }
相关文章推荐
- 51nod 1489 蜥蜴和地下室(DFS)
- 【51Nod】1489 - 蜥蜴和地下室(dfs)
- 51nod 1489 蜥蜴和地下室
- 51nod 1489 蜥蜴和地下室 暴力dfs
- 51nod 1489蜥蜴和地下室
- 1489 蜥蜴和地下室 51NOD
- 51Nod-1489-蜥蜴和地下室
- 51Nod-1489 蜥蜴和地下室(暴力DFS)
- 蜥蜴和地下室 51Nod - 1489
- 51nod 1489 蜥蜴和地下室(dfs or dp)
- 51nod 1489 蜥蜴和地下室(dfs)
- JAVA学习45_51Nod-1489-蜥蜴和地下室
- 51Nod-1489-蜥蜴和地下室
- 51Nod 1489 蜥蜴和地下室 DFS
- 51nod 1489 蜥蜴和地下室 dfs
- 51nod 1489 蜥蜴和地下室 dfs
- 51Nod 1489 蜥蜴和地下室
- 51nod 1489 蜥蜴和地下室
- 51 Nod 1489 蜥蜴与地下室(DFS)
- 51nod--蜥蜴和地下室