Codeforces - 1111B. Average Superhero Gang Power 超人的最大平均战斗力

发布于 2024-09-17 12:19:04 字数 3160 浏览 7 评论 0

题目

n 个超人,一开始的战斗力为 arr[i] ,要你用最多 m 次操作,每次操作两种选择:① 移除一个超人;② 给某个超人战斗力 +1 。每个超人不能加超过 k 的战斗力。问你最大平均战斗力是多少?

解析

这题不能用贪心来做,必须要枚举所有的添加的战斗力移除的超人的数目:

  • 先对数组排序,然后用一个 sums 数组存 0~i 的超人的战斗力的和,方便后面的平均战斗力的计算;
  • 然后枚举所有的添加战斗力和对应的移除超人的数目,每个数目计算出当前的平均战斗力,然后更新最大战斗力即可;
  • 注意注意: 代码中 k、m 一定要和后面的计算一定要用 long ,不然会错,应该是精度问题;
import java.io.*;
import java.util.*;
import java.text.*;

public class Main {

    public static void main(String[] args){
        Scanner in = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        int n = in.nextInt();
        long k = in.nextInt();
        long m = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++)
            arr[i] = in.nextInt();
        Arrays.sort(arr);
        long[] sums = new long[n + 1];
        for(int i = 0; i < n; i++)
            sums[i+1] = sums[i] + arr[i];
        double best = ((double)sums[n]) / n; // don't miss this 
        for(int add = 0; add <= m; add++){ 
            long todel = m - add;
            int realdel = (int)(Math.min(n - 1, todel)); // at least 1 member
            long realadd = (Math.min((n - realdel) * k, add)); // 如果 add 足够就加,如果 add 不够就只能加 add 个
            double cur = ((double)(sums[n] - sums[realdel] + realadd)) / (n - realdel); // not divide realadd
            if(cur > best)
                best = cur;
        }
        out.println(best);
    }
}

提供一开始的思路的代码(相当于贪心),但是是错误的。

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args){
        Scanner in = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        int n = in.nextInt();
        int k = in.nextInt();
        int m = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++)
            arr[i] = in.nextInt();
        Arrays.sort(arr);
        double sum = 0;
        int num = 0;
        for(int i = 0; i < n; i++){ 
            if(m <= 0){ 
                num++;
                sum += arr[i];
                m--;
            }else{// m > 0 
                if(i != n-1 && arr[i] != arr[n-1])
                    m--;
                else {  
                    if(arr[i] == arr[n-1]){ 
                        sum += arr[i] * (n - i);
                        sum += m;
                        num += n - i;
                    }else { 
                        num++;
                        sum += m + arr[i];
                    }
                    break;
                }
            }
        }
        out.println(sum*1.0 / num);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

独享拥抱

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文