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;
}

上一篇:五、LVS+Keepalive+nginx实验


下一篇:vue项目中