飞刀传承 题解

题目id:8426

题目描述

李家自古以来就是飞刀名门,每一任家主都唤作小李。这一代的小李更是青出于蓝,将祖传的飞刀绝技使得出神入化,年纪轻轻便继承了李家祖传的招式,担下了家主之位。不料有日凶兽来袭,李家满门几尽被灭,只剩少数流落在外的弟子得以幸存。他一度想要自尽,却因李家飞刀绝技不能在他手上断绝的信念支撑了下来,残余一口气。现在他将飞刀之术传于你,希望道力高深的你能够帮助他斩灭凶兽。将来遇到漂泊在外的李家弟子能够将飞刀绝技传承下去。
现在你手里有\(n\)把刀,每把刀可飞可砍,对于第\(i\)把刀,如果你用刀砍,将会给凶兽造成\(x_i\)点伤害;如果你使用飞刀之术,将会给凶兽造成\(y_i\)点伤害,但飞出去之后,这把刀就没了。
凶兽的血量\(h\),问如果将凶兽消灭最少需要几次操作。

解题思路

因为题目保证\(x_i\leq y_i\),所以优先考虑用飞刀杀死凶兽,但又考虑到全部飞刀可能杀不死凶兽,因此要分两种情况判断:

  • 全部飞刀能杀死凶兽:对飞刀的伤害从大到小排序,依次飞出每一把刀,直到\(h\leq0\)为止,输出飞出的刀数即可。
  • 全部飞刀不能杀死凶兽:留下一把刀砍伤害最高的刀,将其它刀按飞刀的伤害从大到小排序,飞刀扔完后一直砍,直到\(h\leq0\)为止,输出扔出的飞刀数\(+\)砍的次数即可。

AC Code

#include<bits/stdc++.h>
using namespace std;
pair<long long,long long>a[100005];
long long n,h,ans,sum,cnt;
int main()
{
    scanf("%lld%lld",&n,&h);
    for(int i(1);i<=n;++i)scanf("%lld%lld",&a[i].first,&a[i].second),sum=max(sum,a[i].first);
    sort(a+1,a+n+1,[&](pair<long long,long long>a,pair<long long,long long>b){return a.second>b.second;});
    for(int i(1);i<=n;++i)
    {
        if(a[i].second>=sum&&h>0)h-=a[i].second,++cnt;
        else break;
    }
    if(h<1)printf("%lld",cnt),exit(0);
    if(h%sum!=0)printf("%lld",cnt+h/sum+1);
    else printf("%lld",cnt+h/sum);
    return 0;
}
posted @ 2024-07-18 13:33  Firra3500  阅读(1)  评论(0编辑  收藏  举报