思路与正解一直,按问题代码的思路改了改题解都可以过,但是自己的代码一直卡在#2
#include<bits/stdc++.h>
using namespace std;
const int mysize=1e5+1;
int n;
int l=1,r=1e9,mid;
struct node{
int v;
int w;
}p[mysize];
bool cmp1(struct node x,struct node y)
{
return x.v<y.v;
}
bool cmp2(struct node x,struct node y)
{
return x.w<y.w;
}
bool cmp3(struct node x,struct node y)
{
int Max_w_x=x.v+x.w-mid;
int Max_w_y=y.v+y.w-mid;
return Max_w_x<Max_w_y;
}
bool find(int x)
{
int ind=0;
for(int i=1;i<n;i++)
{
if(p[i].v>=x)
{
ind=i;
break;
}
}
if(ind==0 || ind-1>n-ind+1)
{
return 0;
}
if(ind==1)
{
return 1;
}
sort(p+1,p+ind,cmp2);
sort(p+ind,p+n+1,cmp3);
int l1=1,l2=ind;
while(l1<=ind-1 && l2<=n)
{
int Max_w=p[l2].v+p[l2].w-x;
if(p[l1].w<=Max_w)
{
l1++,l2++;
}
else
{
l2++;
}
}
if(l1==ind)
{
return 1;
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i].v>>p[i].w;
}
sort(p+1,p+n+1,cmp1);
l=1,r=1e9;
while(l<r)
{
mid=(r+l+1)/2;
if(find(mid))//变大
{
l=mid;
}
else
{
r=mid-1;
}
}
cout<<l<<endl;
}
return 0;
}