题目描述
Cuber QQ 终于打败盖农救回了塞尔达公主,海拉鲁大地也开始灾后重建。
在统计学中,幂律表示的是两个量之间的函数关系,其中一个量的相对变化会导致另一个量的相应幂次比例的变化,且与初值无关:表现为一个量是另一个量的幂次方。例如,正方形面积与边长的关系,如果 长度扩大到两倍,那么面积扩大到四倍。
幂律的涉及范围极其广泛,各种各样的物理、生物和人为现象的分布在大致遵循着幂律,包括月球表面月 坑的大小,太阳耀斑的强度,各物种的觅食模式,神经元集群活动模式的规模,大多数语言的用词频率等等。
帕累托法则是幂律分布表现出的重要特征,其指出,约仅有 20% 的因素影响 80% 的结果。也就是说:所有变因中,最重要的仅有 20% ,虽然剩余的 80% 占了多数,影响的幅度却远低于 “关键的少数”。例如, “全球 80%的财富被 20%的人所占据”。
现在Cuber QQ 也想在海拉鲁验证帕累托法则,他调查了海拉鲁大地上居民们拥有的财富数量,你需要找到两个数 x 和 y,使得调查中的数据满足 x% 的人拥有了 y% 的财富,并且要求 y−x 的尽可能大,以方便Cuber QQ 验证帕累托法则的结论。
输入描述
输入第一行包含一个整数 ,表示被调查居民的数量。
第二行包含 n 个整数 表示每个人拥有的财富总额。
输出描述
输出一行一个浮点数,表示答案,即最大的 y−x。输出的答案和标准结果的相对误差和绝对误差在 10−610−6之内会被认为是正确的。
样例
输入:
5
1
3
5
4
2
输出:20.000000000
思路:
要求y-x的最大值,所以我们要让更多的财富在更少的人手里,也就是先看钱多的。
计算出所有的财富和,对财富值进行排序。从大到小,看每一个y和x,计算出他的最大值来
代码:
#include<bits/stdc++.h>
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);
}