这道题与POJ2976类似,但是数据量貌似很大....
二分最大化平均值
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 100000;
const int inf = 10e6;
int v[maxn];
int w[maxn];
struct rec {
double y;
int id;
} r[maxn];
vector<int> vec;
bool comp(const rec& r1, const rec& r2) {
return r1.y > r2.y;
}
bool judge(double x, int n, int k) {
vec.clear();
for (int i = 0; i < n; i++) {
r[i].y = v[i] - x * w[i];
r[i].id = i + 1;
}
sort(r, r + n, comp);
double sum = 0;
for (int i = 0; i < k; i++) {
sum += r[i].y;
vec.push_back(r[i].id);
}
return sum >= 0;
}
int main(int argc, char const *argv[]) {
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%d%d", &v[i], &w[i]);
}
double lb = 0;
double ub = inf;
//50的精度已经够了,100就会超时...
for (int i = 0; i < 50; i++) {
double mid = (lb + ub) / 2;
if (judge(mid, n, k)) {
lb = mid;
} else {
ub = mid;
}
}
for (int i = 0; i < vec.size(); i++) {
if (i)
putchar(' ');
printf("%d", vec[i]);
}
putchar('\n');
return 0;
}