题目链接:http://codeforces.com/contest/913/problem/D
题目大意:给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题总数k<=ai时解决这个问题才有效,求在时限T内选择一些问题解决的最大有效问题数。n<=2*10^5,T<=10 ^ 9。
那么我们枚举解决的问题数k。那么a[i]>=k的问题我们都可以解决。当然是选择这些时间最小的k个。k减小的过程中会新添加一些可以解决的问题。但是之前的问题还是可以解决。我们用优先队列来维护这些可以解决问题就可以了。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
vector<pair<int, int> > v[200005];
priority_queue<pair<int, int> > q;
int main() {
int n, s;
scanf("%d%d", &n, &s);
for(int i=1; i<=n; i++){
int a, b;
scanf("%d%d", &a, &b);
v[a].push_back({b, i});
}
LL sum=0;
for(int i=n; i>=0; i--){
for(int j=0; j<v[i].size(); j++){
q.push(v[i][j]);
sum+=v[i][j].first;
}
while(q.size()>i){
sum-=q.top().first;
q.pop();
}
if(q.size()==i&&sum<=s){
printf("%d\n%d\n", q.size(), q.size());
while(!q.empty()){
printf("%d ", q.top().second);
q.pop();
}
printf("\n");
return 0;
}
}
return 0;
}