Example
input
4
3 6 2 3
5
3 12
7 9
4 14
1 10
8 7
output
1
2
4
0
2
解析:
题意是选一个人去攻击龙,其余人防守龙,可以花费 x 块钱让某英雄能力 +x,问最少的花费是多少。
贪心,选择大于龙的防御力并且最小的那个英雄去攻击(不存在就选择最大的英雄)
二分得出这个英雄,同时和其左侧相邻的英雄比较,花钱少的即为答案。
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,a[N],t,sum,x,y;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),sum+=a[i];
sort(a+1,a+n+1);
scanf("%lld",&t);
while(t--){
ll cnt1=0,cnt2=0;
scanf("%lld%lld",&x,&y);
int l=1,r=n;
while(l<r){ //找出第一个大于等于x的英雄去攻击
int mid=l+r>>1;
if(a[mid]>=x) r=mid;
else l=mid+1;
}
if(a[l]<x) cnt1+=x-a[l];
if(y-sum+a[l]>0) cnt1+=y-sum+a[l];
if(l==1){ //如果a[l]是最小值,则cnt1就是答案
printf("%lld\n",cnt1);
continue;
}
if(a[l-1]<x) cnt2+=x-a[l-1]; //否则,计算 l 左边相邻的值去攻击
if(y-sum+a[l-1]>0) cnt2+=y-sum+a[l-1];
printf("%lld\n",min(cnt1,cnt2)); //答案即为 l-1和 l两个人花费的较小值
}
return 0;
}