B. Zmei Gorynich(贪心+细节)

在这里插入图片描述
在这里插入图片描述
题意:有一个怪物初始化有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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值