Codeforces 1296D Fight with Monsters(贪心)

传送门

题意:

n个怪兽,每个怪兽有一个血量,然后你和另一个人轮流打怪兽,你和另一个的攻击力分别为 a,b
如果怪兽在你打的时候死了,得一分,其他的不得分
现在你有k次机会,可以让另一个人跳过他的回合
问最多能得多少分

思路:

贪心,正常能让自己的回合下杀死的,不用消耗k
如果不能,那就只能让另一个人跳过他的回合,为了能得更多分,尽可能把两个人轮流攻击之后,剩余血量少的时候让对手跳过他的回合,以便被自己击杀得分

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
#define Pll make_pair
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int phi=1e9+6;
int p[maxn];
int main()
{
    int t,n,k,a,b;
        scanf("%d%d%d%d",&n,&a,&b,&k);
        int cnt=0;
        int ans=0;
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            x%=a+b;
            if(x==0)p[++cnt]=b;//刚好被b杀死了,之前还剩b滴血
            else if(x<=a)ans++;//本来能在自己的回合杀死
            else if(x>a) p[++cnt]=x-a;//a<x<a+b,本来就轮到你了,所以就减a
        }
        sort(p+1,p+cnt+1);
        for(int i=1;i<=cnt;i++){
            int l=p[i]/a;
            if(p[i]%a!=0)l++;
            if(k-l>=0)ans++,k-=l;
            if(l<=0)break;
        }
        printf("%d\n",ans);

    return 0;
}
发布了142 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44091178/article/details/104189773