2023年四川大学生程序设计竞赛-A.旷野之息

题目描述

Cuber QQ 终于打败盖农救回了塞尔达公主,海拉鲁大地也开始灾后重建。

在统计学中,幂律表示的是两个量之间的函数关系,其中一个量的相对变化会导致另一个量的相应幂次比例的变化,且与初值无关:表现为一个量是另一个量的幂次方。例如,正方形面积与边长的关系,如果 长度扩大到两倍,那么面积扩大到四倍。

幂律的涉及范围极其广泛,各种各样的物理、生物和人为现象的分布在大致遵循着幂律,包括月球表面月 坑的大小,太阳耀斑的强度,各物种的觅食模式,神经元集群活动模式的规模,大多数语言的用词频率等等。

帕累托法则是幂律分布表现出的重要特征,其指出,约仅有 20% 的因素影响 80% 的结果。也就是说:所有变因中,最重要的仅有 20% ,虽然剩余的 80% 占了多数,影响的幅度却远低于 “关键的少数”。例如, “全球 80%的财富被 20%的人所占据”。

现在Cuber QQ 也想在海拉鲁验证帕累托法则,他调查了海拉鲁大地上居民们拥有的财富数量,你需要找到两个数 x 和 y,使得调查中的数据满足 x% 的人拥有了 y% 的财富,并且要求 y−x 的尽可能大,以方便Cuber QQ 验证帕累托法则的结论。

输入描述

输入第一行包含一个整数 n\left ( 1 \leq n \leq 10^5 \right ) ,表示被调查居民的数量。

第二行包含 n 个整数 a_1,a_2,......a_n(1\leq a_i \leq 10^5)  表示每个人拥有的财富总额。

输出描述

输出一行一个浮点数,表示答案,即最大的 y−x。输出的答案和标准结果的相对误差和绝对误差在 10−610−6之内会被认为是正确的。

样例

输入:

5
1    
3    
5    
4    
2
输出:

20.000000000

思路:

要求y-x的最大值,所以我们要让更多的财富在更少的人手里,也就是先看钱多的。

计算出所有的财富和,对财富值进行排序。从大到小,看每一个y和x,计算出他的最大值来

代码:

#include
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll a[N];
ll sum = 0;
int main()
{
    int n;
    cin >> n;
    for(int i = 0;i < n;i++){
        cin >> a[i];
        sum += a[i];
    }
    sort(a,a+n);
    ll ans = 0;
    double res = 0;
    for(int i = n - 1;i >= 0;i --){
        double x,y;
        ans += a[i];
        x = (n-i) * 100.0 / n;
        y = ans * 100.0 /sum;
        res = max(res,y - x);
    }
    printf("%.8lf",res);
}

你可能感兴趣的:(算法)