POJ3111-K Best

来源:互联网 发布:php header用法 编辑:程序博客网 时间:2024/05/22 02:21

这道题与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;}


0 0
原创粉丝点击