题目大意
牛客王国有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;
}
}