码迷,mamicode.com
首页 > 其他好文 > 详细

POJ - 2976 Dropping tests && 0/1 分数规划

时间:2018-10-05 22:34:07      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:rac   namespace   algorithm   lse   喜羊羊   space   arc   href   tail   

POJ - 2976 Dropping tests

你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} b_{i}}\]
你可以考虑放弃 \(K\) 次成绩, 求最大平均成绩 * 100


小插曲: 被精度卡成喜羊羊


0/1分数规划\(from\)人生导师

Solution

01分数规划(不是很)裸题, 在每次 \(check\) 时, 选取较大的 \(num - K + 1\) 次即可

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
double RD(){
    double out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const int maxn = 2019;
int num, K;
double a[maxn], b[maxn],c[maxn];
bool check(double k){
    for(int i = 1;i <= num;i++){
        c[i] = a[i] - b[i] * k;
        }
    sort(c + 1, c + 1 + num);
    double temp = 0;
    for(int i = num;i > K;i--)temp += c[i];
    if(temp > 0)return 1;
    return 0;
    }
double search(double l, double r){
    double ans;
    while(r - l > 0.000000001){
        double mid = (l + r) / 2;
        if(check(mid))ans = mid, l = mid;
        else r = mid;
        }
    return ans;
    }
int main(){
    while(1){
        num = RD(), K = RD();
        if(!num && !K)return 0;
        for(int i = 1;i <= num;i++)a[i] = RD();
        for(int i = 1;i <= num;i++)b[i] = RD();
        printf("%.0f\n",100 * search(0, 1000000019));
        }
    }

POJ - 2976 Dropping tests && 0/1 分数规划

标签:rac   namespace   algorithm   lse   喜羊羊   space   arc   href   tail   

原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9746044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!