题意:有一个怪物初始化有x个头,然后你有n种攻击方式;每种攻击方式对怪物造成的伤害位:看掉了怪物min(d,x)个头,然后如果怪物头的数目>0,那么他就会在你攻击之后重新生成h个头;
问最小的攻击次数使得怪物over;
其实这道题我刚开始用的结构体比值去找的,估计因为精度问题吧;
后来改了想法:
1.如果我用最大的d去最后攻击怪物,是不是我能保证,关系洗白了并且怪物不可能洗白了还去+h个头涩;所以我找出最大的d
2.怪物实际减少的数量其实就是d-h的差值,所以我只需要去找最大的d-h差值即可,但是注意,如果都是差值都是负数,那么注意用最大的d去和x比大小,因为你攻击一次怪物就洗白了,根本不可能+h头;(就是这里需要注意一点)
3.经过-Maxd之后,剩下的就需要算攻击次数了,这里算的时候肯定是保证差值最大的来算,其实这里就很简单了,只需要找最小整数倍差值使得尽可能刚好攻击完;
也就是这种:
那么我就需要攻击2次,所以为了取整,我这里用了:
所以AC代码:
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int main(){
int T,n,x;
scanf("%d",&T);
while(T--){
int f=0,Maxd=-INF,Maxs=-INF;//记录最大d值 和 最大差值
scanf("%d %d",&n,&x);
int d,h;
for(int i=0;i<n;i++){
scanf("%d %d",&d,&h);
if(d>Maxd)Maxd=d;//记录最大d值
if(d-h>Maxs)Maxs=(d-h);///记录最大差值
if(d-h>0)f=1;//判断是不是全部都是d<=h,因为如果都小于,那么还需要分情况讨论
}
if(Maxd>=x)puts("1");//如果都是小于,那么最大d和x比大小,看是不是能一次defeat怪物
else if(!f)puts("-1");//如果都是d<=h,那么肯定不可能打败怪物了,因为根本你打下,怪物头还变的更多了
else{
int ans=1;
x-=Maxd;//这里就是用最大的差值去-x的,看是不是能一次性打死怪物
if(x>0){//如果一次性打不死
ans+=x/Maxs;//这里就是上面的多打一次,根据是不是能被最大差值整除
if(x%Maxs)ans++;
}
printf("%d\n",ans);//输出答案
}
}
return 0;
}