飞刀传承
题目ID:8426必做题100分
时间限制: 1000ms
空间限制: 524288kB
题目描述
时间:1s 空间:256M
题目描述:
李家自古以来就是飞刀名门,每一任家主都唤作小李。这一代的小李更是青出于蓝,将祖传的飞刀绝技使得出神入化,年纪轻轻便继承了李家祖传的招式,担下了家主之位。不料有日凶兽来袭,李家满门几尽被灭,只剩少数流落在外的弟子得以幸存。他一度想要自尽,却因李家飞刀绝技不能在他手上断绝的信念支撑了下来,残余一口气。现在他将飞刀之术传于你,希望道力高深的你能够帮助他斩灭凶兽。将来遇到漂泊在外的李家弟子能够将飞刀绝技传承下去。
现在你手里有n把刀,每把刀可飞可砍,对于第i把刀,
- 如果你用刀砍,将会给凶兽造成xi点伤害
- 如果你使用飞刀之术,将会给凶兽造成yi点伤害,但飞出去之后,这把刀就没了
凶兽的血量为ℎh,问如果将凶兽消灭最少需要几次操作。
输入格式:
第一行输入两个整数,nh (1<=n<=105 ,1<=ℎ<=109)
接下去n行,每行两个整数 ai,bi 分别代表砍的伤害和飞的伤害。(1<=ai<=bi<=109)
输出格式:
输出一行一个整数,代表最少需要几次操作。
样例输入1:
1 10 3 5
样例输出1:
3
样例输入2:
2 10 3 5 2 6
样例输出2:
2
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize(1)
#include<bits/stdc++.h>
#include<bits/c++config.h>
using namespace std;
const unsigned long long inf=0x10A9FC70042;
int d2[114514];//可用到的单独列
struct dao{
int a,b;
bool operator< (const dao&w)const{
if(b!=w.b){
return b>w.b;
}
}
};
dao d[114514];
int main(){
int n,h;
cin>>n>>h;
//int ksum=0;//砍的伤害总值sum
int maxk=-1919810;//看的最大伤害
//int fsum=0;;//飞sum(飞刀总伤害)
for(int i=0;i<n;i++){
cin>>d[i].a>>d[i].b;
maxk=max(maxk,d[i].a) ;
}
int sum=0;//打几次
sort(d,d+n);
for(int i=0;i<n&&h>0&&d[i].b>maxk;i++){
h-=d[i].b;//加伤害
sum++;
//d[i].a=0;//不能用了
if(0>=h)/*够打死了**/{
cout<<sum;//;
return 0;//结束;
}
//ksum=h-fsum;//剩余血量
}
if(0>=h)/*够打死了**/{
cout<<sum;//;
return 0;//结束;
}
sum+=((h+maxk-1)/maxk);
cout<<sum;
}