#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6;
int a[N],b[N],c[N];
int Binary_search(int x,int n,int arr[N])
{
int low=0;int high=n;int middle=0;
while(low<high)
{
middle=(low+high+1)/2;
if(arr[middle]<=x) low=middle;
else high=middle-1;
}
if(arr[low]>x) return -1;//#
else return low;
}
int main()
{
int n,m;
cin>>n;
for (int i = 1; i <= n; i ++ )
cin>>a[i];
cin>>m;
for (int i = 1; i <= m; i ++ )
cin>>b[i]>>c[i];
sort(a,a+n);
int sum=0;
for (int i = 1; i <= n; i ++ )
sum+=a[i];
for (int i = 1; i <= m; i ++ )
{
int cnt=1e9;
int w=200;
int j=Binary_search(b[i],n,a);
cnt=min(cnt,(max(0,-a[j]+b[i]))+(max(0,-sum+c[i]+a[j])));
for (int k=j+1;k<=j+w&&k<=n;k++)
cnt=min(cnt,(max(0,-a[k]+b[i]))+(max(0,-sum+c[i]+a[k])));
for (int k=j-1;k>=j-w&&k>0;k--)
cnt=min(cnt,(max(0,-a[k]+b[i]))+(max(0,-sum+c[i]+a[k])));
cout<<cnt<<endl;
}
}
错误点:
1,没开long long
2,sort(a,a+n);应该改为sort(a+1,a+n+1);
3,cnt复杂化,不易修改
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const long long N = 1e6;
long long a[N],b[N],c[N];
int Binary_search1(long long x,int n,long long arr[N])
{
int l=1;int r=n;
while(l<r)
{
int mid=l+(r-l+1)/2;
if(a[mid]==x)
{
return mid;
}
if(a[mid]<x)
{
l=mid;
}
else if(a[mid]>x)
{
r=mid-1;
}
}
return l;
}
int Binary_search2(long long x,int n,long long arr[N])
{
int l=1,r=n;
while(l<r)
{
int mid=r-(r-l+1)/2;
if(a[mid]==x)
{
return mid;
}
if(a[mid]<x)
{
l=mid+1;
}
else if(a[mid]>x)
{
r=mid;
}
}
return r;
}
signed main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n;
long long sum=0;
for (int i = 1; i <= n; i ++ )
{cin>>a[i];sum+=a[i];}
cin>>m;
for (int i = 1; i <= m; i ++ )
cin>>b[i]>>c[i];
sort(a+1,a+n+1);
for (int i = 1; i <= m; i ++ )
{
long long cnt1,cnt2;
int j=Binary_search1(b[i],n,a);
cnt1=(max((long long)0,-a[j]+b[i]))+(max((long long)0,-sum+c[i]+a[j]));
j=Binary_search2(b[i],n,a);
cnt2=max((long long)0,-a[j]+b[i])+(max((long long)0,-sum+c[i]+a[j]));
cout<<min(cnt1,cnt2)<<endl;
}
}