屠龙,首先要派一个人攻击力至少等于龙防御力的,然后剩下的人所有攻击力要加起来小于龙攻击力来防御(因为你也不知道是不是你的屠龙勇士是不是去的路上自己家被偷了)
看范围是1e5,那么坑定是排序二分什么的了。
对于一条龙,我们可以选一个最接近它防御的人去斩它,其他剩下的人防御
那么我们可以对数组排序,然后二分查找最接近的人。
#include<bits/stdc++.h>
#define int long long
#define Endl '\n'
#define endl '\n'
#define x first
#define y second
#define pi pair<int ,int>
#define pb push_back
using namespace std;
inline int read(){
int s=0,w=1;
char ch=cin.get();
while(!isalnum(ch)){if(ch=='-')w=-1;ch=cin.get();}
while(isdigit(ch)) s=s*10+ch-'0',ch=cin.get();
return s*w;
}
signed main()
{
cout<<fixed<<setprecision(0);
ios::sync_with_stdio(false);
cin.tie(0);
int n=read();
int a[200005];
int total=0;
for(int i=0;i<n;i++)
{
a[i]=read();
total+=a[i];
}
sort(a,a+n);//多组数据外排序
int t=read();
while(t--)
{
int de=read(),at=read();
int it=upper_bound(a,a+n,de)-a;//upper——bound,algorithm库函数二分查找坐标
if(it==n)//特判是不是没有大于它的勇士
{
cout<<de-a[n-1]+max(0ll,at-total+a[n-1])<<endl;
continue;
}
int co1=LLONG_MAX,co2=LLONG_MAX;/*应该是有规律选最接近他的
(大于等于或小于它二选一)
懒得思考了,取最小,多不了几秒*/
co1=max(0ll,at-total+a[it]);
if(it>0)//无论什么时候都要防止数组越界
co2=max(0ll,de-a[it-1]+max(0ll,at-total+a[it-1]));
cout<<min(co1,co2)<<endl;
}
return 0;
}