D. Fight with Monsters
题意:
有n个野兽 排成一排
第i个野兽有hi点生命值
你的攻击力等于 a点生命值 你的对手的攻击力等于b点生命值
你和你的对手现在正在对抗这些野兽
一开始 你和你的对手都到第一个野兽那里打它 直到打死
然后去第二个野兽那里 知道打死它
以此类推
当一个野兽的生命值小于等于0时 则认为这个野兽死了
然后你和你的对手轮流打这个怪兽 如果你打死了这个怪兽 那你你获得一点经验值 如果是你的对手打死的那就没有
对于每一次打怪 你都是先手(不管是谁杀了上一个怪)
现在你有一种科技 能够让你的对手停止一次攻击 这种科技最多使用k次
现在 求出 你最多得到多少点经验值
这个可以看出就是一个简单的模拟题
题解:
把每一次循环打的部分都直接在输入的时候就去掉
那剩下的就是怪兽最多不超过一轮攻击的血量了 那这个时候因为我们总是先手
那么现在这个时候对手就不能出手了 所以此时 怪兽剩下的血量越少 对得到这个经验就越有利
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx=2e5+10;
int a,b,k,n,h[maxx];
int main(){
scanf("%d%d%d%d",&n,&a,&b,&k);
for(int i=1;i<=n;i++){
scanf("%d",&h[i]);
//从这个对这个数据处理一下
h[i]=h[i]-(h[i]/(a+b))*(a+b);
//这里有 正好这样一轮一轮的打 打死的可能
if(h[i]==0){
h[i]=a+b;
}
//处理这一种可能
if(h[i]%a==0){
h[i]=h[i]/a-1;
}
else{
h[i]=h[i]/a;
}
//这个样子就是 对于每一个怪而言 需要用的科技的次数了
}
sort(h+1,h+1+n);
int sum=0;
for(int i=1;i<=n;i++){
if(h[i]>k){
break;
}
sum++;
k-=h[i];
}
printf("%d\n",sum);
return 0;
}