1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #include <climits> using namespace std; typedef pair<int, int> P; const int MAXC = 100010; const int MAXN = 20005; int N, C, F; P cows[MAXC]; priority_queue<int, vector<int>, less<int> >que; priority_queue<int, vector<int>, less<int> >que2; int rightMin[MAXC]; int leftMin[MAXC];
void solve() { int ans = 0; memset(rightMin, 0, sizeof(rightMin)); memset(leftMin, 0, sizeof(leftMin)); int num = N >> 1; int totalSum = 0; for(int i = 0;i < C; i++) { if(ans <= num) { que.push(cows[i].second); ans++; totalSum += cows[i].second; rightMin[i] = totalSum; continue; } rightMin[i] = totalSum - que.top() + cows[i].second; if(cows[i].second < que.top()) { totalSum -= que.top(); que.pop(); que.push(cows[i].second); totalSum += cows[i].second; } } totalSum = 0; ans = 0; for(int i = C - 1; i >= 0; i--) { if(ans <= num) { que2.push(cows[i].second); ans++; totalSum += cows[i].second; leftMin[i] = totalSum; continue; } leftMin[i] = totalSum - que2.top() + cows[i].second; if(cows[i].second < que2.top()) { totalSum -= que2.top(); que2.pop(); que2.push(cows[i].second); totalSum += cows[i].second; } } int CSAT = 0; for(int i = num; i < C - num; i++) { if(rightMin[i] + leftMin[i] - cows[i].second <= F) { CSAT = cows[i].first; printf("%d\n", CSAT); return ; } } printf("-1\n"); }
int main(){ while(scanf("%d%d%d", &N, &C, &F) != EOF) { for(int i = 0; i < C; i++) { scanf("%d%d", &cows[i].first, &cows[i].second); } sort(cows, cows + C, greater<P>()); solve(); } }
|