C. Slay the Dragon
题目地址:https://codeforces.com/contest/1574/problem/C
题意:有n个英雄,英雄的战力为a1,a2,…,an,面对防御力为x攻击力为y的恶龙,要求派一英雄去击杀恶龙(战力大于等于x即可击杀),剩下的英雄抵御恶龙攻击(剩下所有人的战力大于等于y才能防御成功),你可以随意增加每个英雄的战力,问最少增加多少战力才能击杀并抵御恶龙。
思路:二分查找第一个大于等于x的数ak,如果ak=x那么派ak去击杀恶龙要增加的战力最少,如果ak>x那么派ak或者ak-1去击杀恶龙,求二者需要增加的战力,其中小的就是答案,ak=x可以并入ak>x的情况中计算,注意特判k=0和k=n的情况。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=200005;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll n,m,sum=0,arr[N];
cin>>n;
for(int i=0; i<n; i++)
{
cin>>arr[i];
sum=sum+arr[i];
}
sort(arr,arr+n);
cin>>m;
while(m--)
{
ll x,y;
cin>>x>>y;
int k=lower_bound(arr,arr+n,x)-arr;
if(k==n)
{
ll ans=x-arr[k-1];
if(sum-arr[k-1]<y) ans=ans+y-sum+arr[k-1];
cout<<ans<<'\n';
}
else if(k==0)
{
ll ans=0;
if(sum-arr[k]<y) ans=ans+y-sum+arr[k];
cout<<ans<<'\n';
}
else
{
ll ans1=x-arr[k-1];
if(sum-arr[k-1]<y) ans1=ans1+y-sum+arr[k-1];
ll ans2=0;
if(sum-arr[k]<y) ans2=ans2+y-sum+arr[k];
cout<<min(ans1,ans2)<<'\n';
}
}
return 0;
}