2.贪心+排序
作者:互联网
https://codeforces.com/problemset/problem/1296/D
题意:有n个怪兽编号是1~n,每个怪兽都有一个对应的生命值hi,你有你的攻击值a,你对手的攻击值b,当你把怪我打死时,你可以获得一分,若你的对手打死则什么都没有。你有一个技能(对手没有),总共能使用k次,让你的对手跳过他打怪的机会,让你打。要求你最多可以获得多少分数,即可以打死多少只怪(当怪的血量小于等于0时,为打死)。
题解:
1.我们把两人轮流攻击一次当成一个循环,这一次循环造成的伤害为 a+b。当怪兽的健康值小于a+b时,即hi=hi%(a+b),hi<(a+b)
2.如果hi=0或者hi>a,在不使用特殊技能时是被对手打死的,其他情况均是自己直接打死(可直接加一分)
3.所以,当hi=0或者hi>a时枚举出你要打死这只怪需要使用多少次技能,然后按照使用技能的次数从小到大排序。
#include<bits/stdc++.h>
using namespace std;
const int Maxn=200005;
int p[Maxn];
int n,a,b,k;
int main()
{
cin>>n>>a>>b>>k;
int hi;
int ans=0;
int cnt=0;
for(int i=1;i<=n;i++)
{
cin>>hi;
hi=hi%(a+b);
if(hi==0)hi=a+b;
if(hi<=a)ans++;//不使用技能有自己直接打死
else
{
hi=hi-a;
p[++cnt]=hi/a;
if(hi%a)p[cnt]++; // 求出需要用多少次特殊操作
}
}
n=cnt;
sort(p+1,p+1+n);
for(int i=1;i<=n;i++) // 贪心
{
if(k>=p[i])ans++,k-=p[i];
else break;
}
printf("%d\n",ans);
return 0;
}
标签:打死,cnt,int,对手,hi,hi%,排序,贪心 来源: https://www.cnblogs.com/jutian/p/14231881.html