1 solutions

  • 0
    @ 2025-11-5 18:20:32

    C++ :

    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    int N, C, F;
    pair<int,int> a[200100];
    ll c[200100], d[200100];
    priority_queue<int> Q;
    
    int main()
    {
    	//freopen("money.in","r",stdin);
    	//freopen("money.out","w",stdout);
    	while(scanf("%d%d%d",&N,&C,&F) != EOF){
    		for(int i = 1;i <= C; ++i) scanf("%d%d",&a[i].first,&a[i].second);
    		sort(a + 1,a + 1 + C);
    		memset(c, 0, sizeof(c));
    		while(!Q.empty()) Q.pop();
    		ll sum = 0ll;
    		for(int i = 1;i <= N/2; ++i){
    			Q.push(a[i].second);
    			sum += 1ll*a[i].second;
    		}
    		for(int i = N/2 + 1;i <= C; ++i){
    			c[i] = sum;
    			if(Q.empty()) continue;
    			if(Q.top() > a[i].second){
    				sum = sum - Q.top() + a[i].second;
    				Q.pop();
    				Q.push(a[i].second);
    			}
    		}
    		while(!Q.empty()) Q.pop();
    		sum = 0ll;
    		for(int i = C;i >= C - N/2 + 1; --i){
    			Q.push(a[i].second);
    			sum += 1ll*a[i].second;
    		}
    		for(int i = C - N/2;i >= 1; --i){
    			d[i] = sum;
    			if(Q.empty()) continue;
    			if(Q.top() > a[i].second){
    				sum = sum - Q.top() + a[i].second;
    				Q.pop();
    				Q.push(a[i].second);
    			}
    		}
    		int ans = -1;
    		for(int i = N/2 + 1;i <= C - N/2; ++i)
    			if(a[i].second + c[i] + d[i] <= F) ans = max(ans, a[i].first);
    		printf("%d\n",ans);
    	}
    }
    
    
    • 1

    Information

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