博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod蜥蜴与地下室(1498)(暴力搜索)
阅读量:5100 次
发布时间:2019-06-13

本文共 1316 字,大约阅读时间需要 4 分钟。

题意:一个数组s,再给你a,b值,除了s1和sn外,你可以攻击其他元素,你对这个元素的伤害为a,那么他两边的元素会受到b的牵连伤害,si-a,si-1-b,si+1-b;

求最小的次数,使得这个数组的值全部小于0;

解题思路:首先1和n不能直接攻击,所以我们得先把1和n的先处理下,然后我们会发现剩下的元素都有两种状态,一种是我们直接打死他,另一种是我们通过牵连伤害打死他,因为数据小,所以直接暴力搜索就行了

代码:

#include<iostream>

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<set>
#include<map>
#include<queue>
#include<vector>
#define ll long long int
#define mod 1000000007
#define me(a,b) memset(a,b,sizeof(a))
const int inf=0x7fffffff;
using namespace std;
int h[20];
int ans=inf;
int n,a,b;
void dfs(int pos,int sum)
{
if(pos==n)
{
ans=min(ans,sum);
return;
}
if(h[pos-1]<0)
dfs(pos+1,sum);
int v=0;
if(h[pos-1]>=0)
{
v=h[pos-1]/b+1;
h[pos-1]-=v*b;
h[pos]-=v*a;
h[pos+1]-=v*b;
dfs(pos+1,sum+v);
h[pos-1]+=v*b;
h[pos]+=v*a;
h[pos+1]+=v*b;
}
int vv=h[pos]/a+1;
if(h[pos]>=0&&vv>v)
{
for(int i=v+1;i<=vv;i++)
{
h[pos-1]-=i*b;
h[pos]-=i*a;
h[pos+1]-=i*b;
dfs(pos+1,sum+i);
h[pos-1]+=i*b;
h[pos]+=a*i;
h[pos+1]+=b*i;
}
}
return;
}
int main()
{
int h1,hn;
while(cin>>n>>a>>b)
{
h1=0;
hn=0;
for(int i=1;i<=n;i++)
cin>>h[i];
h1=h[1]/b+1;
h[1]=h[1]-h1*b;
h[2]=h[2]-h1*a;
h[3]=h[3]-h1*b;
if(h[n]>=0)
{
hn=h[n]/b+1;
h[n]=h[n]-hn*b;
h[n-1]=h[n-1]-hn*a;
h[n-2]=h[n-2]-hn*b;
}
dfs(2,0);
cout<<ans+h1+hn<<endl;
}
return 0;
}

转载于:https://www.cnblogs.com/huangdao/p/7944028.html

你可能感兴趣的文章
知乎页面颜色个性化修改
查看>>
并发编程——java线程基础之线程状态转换
查看>>
隐式动画和核心动画
查看>>
九大排序算法再总结
查看>>
斐波那契数列---函数与生成器
查看>>
C# 数组,对象实例化并赋值
查看>>
2017.1.20 精英班试题讲解
查看>>
Cogs 465. 挤牛奶
查看>>
SQL优化语句提升执行效率
查看>>
week_2 四则运算
查看>>
08-数据类型(2)
查看>>
【NOIP2014】伤感·伤感·伤感
查看>>
C# Win OS Resource
查看>>
2^n表
查看>>
二叉树递归非递归前中后
查看>>
超级好用的视频压缩工具
查看>>
《抽象是一种美》
查看>>
.NET通用权限系统快速开发框架源代码
查看>>
计数dp-hdu-4054-Number String
查看>>
JavaScript字符串、数组操作总结一
查看>>