题目描述
李家自古以来就是飞刀名门,每一任家主都唤作小李。这一代的小李更是青出于蓝,将祖传的飞刀绝技使得出神入化,年纪轻轻便继承了李家祖传的招式,担下了家主之位。不料有日凶兽来袭,李家满门几尽被灭,只剩少数流落在外的弟子得以幸存。他一度想要自尽,却因李家飞刀绝技不能在他手上断绝的信念支撑了下来,残余一口气。现在他将飞刀之术传于你,希望道力高深的你能够帮助他斩灭凶兽。将来遇到漂泊在外的李家弟子能够将飞刀绝技传承下去。
现在你手里有\(n\)把刀,每把刀可飞可砍,对于第\(i\)把刀,如果你用刀砍,将会给凶兽造成\(x_i\)点伤害;如果你使用飞刀之术,将会给凶兽造成\(y_i\)点伤害,但飞出去之后,这把刀就没了。
凶兽的血量\(h\),问如果将凶兽消灭最少需要几次操作。
题意简述
你有\(n\)把刀,要打一个血量为\(h\)的凶兽。你有用刀砍和飞刀两种攻击方式。对于第\(i\)把刀,刀砍的伤害为\(x_i\),飞刀的伤害为\(y_i\),但飞出去后第\(i\)把刀就没了。
问杀死凶兽最少需要几次操作。
解题思路
因为题目保证\(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;
}
标签:int,题解,T3,凶兽,second,飞刀,伤害,李家
From: https://www.cnblogs.com/988176-/p/18309348