牛客 骑士

题目大意

牛客王国有n位骑士,第ii位骑士的战斗力为ai​,防御力为bi​,生命值为hi​。对于两位骑士i, ji(i/​=j),如果ai​−bj​≥hj​,则第ii位骑士是可以秒第j位骑士的,注意可能存在两位骑士能够相互秒(取决于谁先出手)。
牛客王国的国王牛牛举办了一场骑士大赛,n位骑士需要两两进行战斗,由于被秒是件不光彩的事情,所以n位骑士都要去商店购买生命药剂使得自己的生命值hi​提升,使得自己不会被除自己以外的任何一位骑士秒。
11支生命药剂可以提升骑士11点生命值,商店打听到了这个消息,为了满足所有骑士的需求,商店想知道自己至少需要准备多少支生命药剂的库存。

解题

从题意可知每个人只要不被别人秒掉就可以,去遍历每一个对手需要买多少药剂,再选择最大值的方法显然超时,所以我们只需要找到攻击力最高者次高者,让除了最高者本身以外的所有的人都去判断需要多少药剂,最高者用次高者的攻击减去防御加生命得到结果。

最后代码献上

#include <cstdio>
#include <iostream>
#include <string.h>
#include <cmath>
using namespace std;
struct knight{
	int att;
	int def;
	int lif;
	int sum;
};
knight a[500001];
int main(){
	int i;
	cin>>i;
	while(i--){
		int p;
		cin>>p;
		for(int n=1;n<=p;n++){
			cin>>a[n].att>>a[n].def>>a[n].lif;
			a[n].sum=a[n].def+a[n].lif;
		}
		int maxer=0,lower=0,flag;
		for(int n=1;n<=p;n++){
			if(a[n].att>maxer){
				maxer=a[n].att;
				flag=n;//记录最高者的序号;
			}
		}
		for(int n=1;n<=p;n++){
			if(a[n].att<maxer&&a[n].att>lower){
				lower=a[n].att;
			}
		}
		long long sum1=0;
		for(int n=1;n<=p;n++){
			if(a[n].sum>maxer&&n!=flag){
				sum1=sum1;//这是不需要买药的情况
			}else if(a[n].sum<=maxer&&n!=flag){
				sum1=maxer-a[n].sum+1+sum1;
			}else if(n==flag){
				if(a[n].sum<=lower){
					sum1=lower-a[n].sum+1+sum1; 
				}
			}
		}
		cout<<sum1<<endl;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值