zoukankan      html  css  js  c++  java
  • 【POJ2976】Dropping tests

    Description

    In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cumulative average is defined to be

    .

    Given your test scores and a positive integer k, determine how high you can make your cumulative average if you are allowed to drop any k of your test scores.

    Suppose you take 3 tests with scores of 5/5, 0/1, and 2/6. Without dropping any tests, your cumulative average is . However, if you drop the third test, your cumulative average becomes .

    Input

    The input test file will contain multiple test cases, each containing exactly three lines. The first line contains two integers, 1 ≤ n ≤ 1000 and 0 ≤ k < n. The second line contains n integers indicating ai for all i. The third line contains n positive integers indicating bi for all i. It is guaranteed that 0 ≤ ai ≤ bi ≤ 1, 000, 000, 000. The end-of-file is marked by a test case with n = k = 0 and should not be processed.

    Output

    For each test case, write a single line with the highest cumulative average possible after dropping k of the given test scores. The average should be rounded to the nearest integer. 

    题目大意

    给出$n$个$a$和$b$,让选出$n-k$个使得$frac{sum a_i}{sum b_i}$最大

    思路

    题目要求 $frac{sum a_i}{sum b_i} geq x$,$x$的最大值 ,也就是$sum a_i - x sum b_i geq 0$ 二分完把$a_i-x b_i$排序取$n-k$个大的即可

    /************************************************
    *Author        :  lrj124
    *Created Time  :  2018.09.28.20:35
    *Mail          :  1584634848@qq.com
    *Problem       :  poj2976
    ************************************************/
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    const int maxn = 1000 + 10;
    int n,k,a[maxn],b[maxn];
    double tmp[maxn];
    inline bool check(double x) {
        for (int i = 1;i <= n;i++) tmp[i] = a[i]-x*b[i];
        sort(tmp+1,tmp+n+1);
        double ans = 0;
        for (int i = k+1;i <= n;i++) ans += tmp[i];
        return ans >= 0;
    }
    int main() {
        while (cin >> n >> k) {
            if (!n && !k) break;
            for (int i = 1;i <= n;i++) cin >> a[i];
            for (int i = 1;i <= n;i++) cin >> b[i];
            double l = 0,r = 0x3f3f3f3f;
            while (fabs(r-l) >= 1e-6) {
                double mid = (l+r)/2;
                if (check(mid)) l = mid;
                else r = mid;
            }
            int ans = int(l*100+0.5);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    训练总结
    图论--最短路--SPFA模板(能过题,真没错的模板)
    图论--最短路-- Dijkstra模板(目前见到的最好用的)
    The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
    关于RMQ问题的四种解法
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
    ZOJ 3607 Lazier Salesgirl (枚举)
    ZOJ 3605 Find the Marble(dp)
  • 原文地址:https://www.cnblogs.com/lrj124/p/9721006.html
Copyright © 2011-2022 走看看