1 solutions
-
0
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