zoukankan      html  css  js  c++  java
  • 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);
        }
    } 
  • 相关阅读:
    c++实现单例
    shell查看并修复网络连接
    shell检测interface是否已分配ip,qt调用shell脚本
    ubuntu, Debian, CentOS
    Makefile 中:= ?= += =的区别
    我开新博客了
    soft lockup和hard lockup介绍
    linux系统奔溃之vmcore:kdump 的亲密战友 crash
    布局文件中的sp、dp还有px的区别
    kvmalloc函数
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12687487.html
Copyright © 2011-2022 走看看