最大化平均值——POJ2976

題目描述:

有n場考試,每場考試有b個問題,你每次能答對a個問題,你現在可以捨棄k個科目,使得你的分數100*Σa/Σb最大。

大致思路:

這個題目和poj3111思路很類似,也是平均化最大值,詳細思考過程參見POJ3111。不過這個題需要注意一點就是最後結果乘100之後取整需要四捨五入。

代碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

typedef long long ll;
struct test {
    ll a,b;
    double p;
    void cal(double x) {
        p = a - b * x;
    }
    bool operator < (const test& a) const {
        return p > a.p;
    }
}t[1010];
int n,k;

int main() {
    while (cin>>n>>k,n) {
        for (int i = 0; i < n; i++) {
            scanf("%d",&t[i].a);
        }
        for (int i = 0; i < n; i++) {
            scanf("%d",&t[i].b);
        }
        double l = 0,r = 1;
        for (int kk = 0; kk < 100; kk++) {
            //cout<<l<<" "<<r<<endl;
            double mid = (l + r) / 2;
            for (int i = 0; i < n; i++) t[i].cal(mid);
            sort(t,t+n);
            double sum = 0;
            for (int i = 0; i < n-k; i++) sum += t[i].p;
            if (sum >= 0) l = mid;
            else r = mid;
        }
        cout<<(int)(l * 100 + 0.5)<<endl;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章