您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: