1 solutions

  • 0
    @ 2025-11-5 16:29:15

    C++ :

    /*
    	author :hzoi_ztx
    	title  :奖学金 
    	ALG    :二分 
    	comment:
    
    	[2014 10 15 test]
    */
    
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    
    #define  maxn  10002
    #define  maxc  100002
    
    struct pig{
    	long long a , b , p ;
    } a[maxc] ;
    
    long long n , c ;
    long long mid = 0 ;
    long long F ;
    long long s1 = 0 , s2 = 0 ;
    long long cc[maxc] = {0} ;
    bool L[maxc] = {0} ;//记录的都是值排序后的位置 
    bool R[maxc] = {0} ;
    
    bool cmp1(const pig a , const pig b) {
    	return a.b < b.b ;
    }
    
    bool cmp2(const pig a , const pig b) {
    	return a.a > b.a ;
    }
    
    std::priority_queue<long long>q1,q2 ;//大根 
    
    int main() {
    	//#define READ
    	#ifdef  READ
    		freopen("finace.in" ,"r",stdin ) ;
    		freopen("finace.out","w",stdout) ;
    	#endif
    	long long i , j ;
    	scanf("%lld%lld%lld", &n , &c , &F ) ;
    	for (i = 1 ; i <= c ; i ++ )
    		scanf("%lld%lld", &a[i].a , &a[i].b ) ;
    	std::sort(a+1 , a+c+1 , cmp1) ;
    	for (i = 1 ; i <= c ; i ++ ) a[i].p = i , cc[i] = a[i].b ;
    	std::sort(a+1 , a+c+1 , cmp2) ;
    	mid = (n>>1)+1 ;
    	for (i = 1 ; i < mid ; i ++ ) {
    		s1 += a[i].b ; q1.push(a[i].p) ;
    		L[a[i].p] = true ;
    	}
    	L[mid] = true ;
    	j = 0 ;
    	for (i = 1 ; i <= c ; i ++ ) {
    		if (L[i]) continue ;
    		//printf("%d\n",i);
    		q2.push(-i) ;
    		if (++j <= mid-1) {s2 += cc[i] ; R[i] = true ;}
    	}
    	//printf("%lld %lld %d\n",s1,s2,a[mid].b) ;
    	if (s1+s2+a[mid].b <= F) {
    		printf("%lld\n",a[mid].a) ;
    		return 0 ;
    	}
    	long long now ;
    	for (i = mid+1 ; i+mid-1 <= c ; i ++ ) {
    		L[a[i].p] = true ;
    		if (a[i-1].p < q1.top()) {//维护左边 
    			s1 -= cc[q1.top()] ;
    			s1 += cc[a[i-1].p] ;
    			q1.pop() ;
    			q1.push(a[i-1].p) ;
    		}
    		
    		if (R[a[i].p]) {//维护右边 
    			s2 -= a[i].b ;
    			R[a[i].p] = false ;
    			while (!q2.empty() && L[-q2.top()]) {
    				q2.pop() ;
    			}
    			s2 += cc[-q2.top()] ;
    			R[-q2.top()] = true ;
    		}
    		
    		if (s1+s2+a[i].b <= F) {
    			printf("%lld\n", a[i].a ) ;
    			return 0 ;
    		}
    	}
    	printf("-1\n") ;
    	return 0 ;
    }
    
    • 1

    Information

    ID
    17793
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By