https://vjudge.net/problem/CodeForces-1296D
思路:有
n
n
n只怪兽,第
i
i
i只血量为
h
i
h_i
hi,你和小明轮流对第
i
i
i只怪兽进行攻击,你的攻击力为
a
a
a,他的攻击力为
b
b
b,如果你杀死了第
i
i
i只怪兽,你获得
1
1
1分,否则不得分,然后你们开始攻击第
i
+
1
i+1
i+1只怪兽……同时你有
k
k
k次机会使得小明跳过
1
1
1回合,问你最多能获得几分。
思路:贪心, h i h_i hi对 a + b a+b a+b取模,如果取模后 h i h_i hi为 0 0 0,那么应该令 h i = a + b h_i=a+b hi=a+b,然后对其进行判断,如果 h i < = a h_i<=a hi<=a,那么 a n s + + ans++ ans++,否则我们只能消耗机会令 h i h_i hi不断减小直到其 < = a <=a <=a,根据贪心策略, h i h_i hi越小越好,所以把这些没有贡献的拿出来从小到大排序再算一遍就行。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int n,a,b,k;
int h[maxn],c[maxn];
int main()
{
scanf("%d %d %d %d",&n,&a,&b,&k);
int tmp=a+b,ans=0,len=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
h[i]%=tmp;
if(!h[i])
h[i]=tmp;
if(h[i]<=a)
++ans;
else
c[len++]=h[i];
}
for(int i=0;i<len;i++)
c[i]=ceil(c[i]*1.0/a)-1;
sort(c,c+len);
for(int i=0;i<len;i++)
{
if(k<c[i])
break;
k-=c[i];
++ans;
}
printf("%d\n",ans);
return 0;
}