开始写这个题的之后怎么写都些不对,而且因为考虑到分数相等的情况所以写的比较复杂(也可能是别的原因)一直WA,后来参考了大神的博客,其实对于这种二分的题目,如果有相等的情况,排个序人为加一个标准让所有元素可比就可以直接二分了嘛
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<utility> #include<vector> #define INF 0x3fffffff using namespace std; typedef long long ll; int N,C,F; const int maxv=1e5+30; struct cow{ int od,a,s; }A[maxv]; bool cmp_s(cow a,cow b){ return a.s<b.s; } bool cmp_a(cow a,cow b){ return a.a<b.a; } int getans[maxv],getaid[maxv]; int main(){ freopen("in.txt","r",stdin); cin>>N>>C>>F; for(int i=0;i<C;i++) scanf("%d%d",&A[i].s,&A[i].a); sort(A,A+C,cmp_s); for(int i=0;i<C;i++) A[i].od=i,getans[i]=A[i].s,getaid[i]=A[i].a; sort(A,A+C,cmp_a); ll ans=-1; ll l=-1,r=C; ll half=N>>1; while(r-l>1){ ll mid=(r+l)>>1; ll tol=getaid[mid]; ll low=0,upp=0,mida=0; for(int i=0;i<C;i++){ if(A[i].od<mid&&tol+A[i].a<=F&&low<half){ low++; tol+=A[i].a; } else if(A[i].od>mid&&tol+A[i].a<=F&&upp<half){ upp++; tol+=A[i].a; } } if(low<half&&upp<half) break; else if(low>=half&&upp>=half){ ans=getans[mid]; l=mid; } else if(low<half){ l=mid; } else r=mid; } cout<<ans<<endl; return 0; }