2025春训第二十场
问题 B: 狗是啥呀
题目描述
在神秘的地狱深处,有着一种神秘的犬类生物,据传这种生物长了x个脑袋,并且具有强大的生命力。由于见过它的人全都下落不明,至今没有人知道它的真面目。
一位勇士为了斩杀这奇怪的生物,来到地狱一探究竟。勇士做了充足的准备,他在身上携带了n种武器,每种武器每次可以击毙这种生物di个头,但这种生物在这之后会吸收武器产生的能量,再长出hi个头。当它的头的数量小于等于0时,它就会被击败(且不能重新长出头)。注意,每种武器可以无限次使用。
作为勇士的智囊团中的一员,你需要告诉勇士,他最少需要使用多少次武器才能击败这种生物。输入
输入第一行包含两个整数n,x,分别表示勇士的武器种类数与生物头的数量。
之后n行,每行给出di,hi。输出
输出共一行,表示最少需要使用多少次武器。若不能击败,则输出 -1。
样例输入 Copy
【样例1】 3 10 6 3 8 2 1 4 【样例2】 4 10 4 1 3 2 2 6 1 100 【样例3】 2 15 10 11 14 100样例输出 Copy
【样例1】 2 【样例2】 3 【样例3】 -1提示
样例 1 解释:可以先使用一次第一个技能,生物还剩下个10-6+3=7个头。第二次使用第二个技能,剩下7-8=-1<0 个头,则直接被击败。
对于100%的数据,保证1≤n≤100,1≤x,di,hi≤109
错了好几遍。用武器砍,选武器-生长最大的 。最后一次选最厉害的武器直接砍掉
特判武器-生长都是负数,但是可以直接杀掉的
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,x;
ll d[109],h[109],k[109],m=0,c,q=0;
int main(){cin>>n>>x;for(int i=0;i<n;++i){cin>>d[i]>>h[i];k[i]=d[i]-h[i];}for(int i=0;i<n;++i){if(m<k[i]){m=k[i];c=i;}q=max(d[i],q);//cout<<"!"<<k[i]<<'\n';}if(q>=x){cout<<1;return 0;}if(m<=0){cout<<-1;return 0;}//cout<<x<<" "<<m<<'\n';ll z=x-q;ll ans=1+z/m+(z%m!=0?1:0);cout<<ans;return 0;
}