0
点赞
收藏
分享

微信扫一扫

牛客 骑士

ZGtheGreat 2022-02-19 阅读 87
算法

题目大意

牛客王国有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;
	}
}
举报

相关推荐

------------------牛客

牛客--手套

能否获胜【牛客】

仿牛客项目

成绩排序-牛客

牛客MySQL复习

0 条评论