1217B.Zmei Gorynich(思维)

你在和一个斯拉夫人传说中凶猛的怪物,一个巨大的龙一样的爬行动物,有多个头!

最初,Zmei Gorynich有x个头像。你可以打n种牌。如果你使用第i种类型的打击,你将Gorynich人头的数量减少最小(di,curX), curX是当前人头的数量。但是如果在这次打击之后,Zmei Gorynich至少有一个头,他就会长出新的头。如果curX=0,那么Gorynich就输了。

你可以以任何顺序,任意次数的打击。

例如,如果curX=10, d=7, h=10,那么正面的数量就会变成13(你切掉7个正面,然后Zmei长出10个新的),但是如果curX=10, d=11, h=100,那么正面的数量就会变成0,Zmei Gorynich就被认为是失败的。

计算击败Zmei Gorynich的最小打击次数!

你必须回答独立的问题。

题解:

其实每次攻击的实际杀伤就是砍掉的头和长出来的头之差。所以可以统计两个最大值,一个是单次攻击的最大值,一个是实际杀伤的最大值。因为一次性打死了就不会长出来了。

如果单次杀伤的最大值大于总头数,那么一次攻击就能完成。

如果单词攻击的最大值小于总头数同时最大的实际杀伤值为0,那么不可能完成,输出-1。

然后贪心,先用最大的攻击力砍一刀,剩下的生命值除r,向上取整,同时再加一刀,这一步还没有理解。

#include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
int T,N,X;
int main () {
    scanf("%d",&T);
    while (T--) {
        scanf("%d%d",&N,&X);
        int l=0;
        int r=0;
        for (int i=0;i<N;i++) {
            int x,y;
            scanf("%d%d",&x,&y);
            l=max(l,x);
            r=max(r,x-y);
        }
        if (l>=X) {
            printf("1
");
            continue;
        }
        if (r==0) {
            printf("-1
");
            continue;
        }
        printf("%d
",(X-l+r-1)/r+1);
    }
} 
原文地址:https://www.cnblogs.com/zhanglichen/p/12687487.html