悬关,似乎是子函数的问题
查看原帖
悬关,似乎是子函数的问题
758581
name1ess_0123210楼主2024/10/3 23:57

思路与正解一直,按问题代码的思路改了改题解都可以过,但是自己的代码一直卡在#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;
}
2024/10/3 23:57
加载中...