第十题 付账问题
  【题目描述】 
  几个人一起出去吃饭是常有的事。但在结帐的时候,常常会出现一些争执。
 
  现在有 n 个人出去吃饭,他们总共消费了 S 元。其中第 i 个人带了 ai 元。幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出多少钱呢?
 
  为了公平起见,我们希望在总付钱量恰好为 S 的前提下,最后每个人付的钱的标准差最小。这里我们约定,每个人支付的钱数可以是任意非负实数,即可以不是1分钱的整数倍。你需要输出最小的标准差是多少。
 
  标准差的介绍:标准差是多个数与它们平均数差值的平方平均数,一般用于刻画这些数之间的“偏差有多大”。形式化地说,设第 i 个人付的钱为 bi 元,那么标准差为 : [参见p1.png]
 
  【输入格式】 
  从标准输入读入数据。
 
  第一行包含两个整数 n、S; 
  第二行包含 n 个非负整数 a1, …, an。
 
  【输出格式】 
  输出到标准输出。
 
  输出最小的标准差,四舍五入保留 4 位小数。 
  保证正确答案在加上或减去 10^−9 后不会导致四舍五入的结果发生变化。
 
  【样例1输入】 
  5 2333 
  666 666 666 666 666
 
  【样例输出】 
  0.0000
 
  【样例解释】 
  每个人都出 2333/5 元,标准差为 0。
 
  再比如: 
  【样例输入】 
  10 30 
  2 1 4 7 4 8 3 6 4 7
 
  【样例输出】 
  0.7928
 
  【数据说明】 
  对于 10% 的数据,所有 ai 相等; 
  对于 30% 的数据,所有非 0 的 ai 相等; 
  对于 60% 的数据,n ≤ 1000; 
  对于 80% 的数据,n ≤ 10^5; 
  对于所有数据,n ≤ 5 × 10^5, 0 ≤ ai ≤ 10^9。

题解

这是一道想出来就ac,想不出来就0分的贪心题,贪心策略如下:

先求一个不变的平均费用avg = S/n,如果有人付不起avg,他们要把他们的钱全付完,不够的需要钱多于avg的人付,但是这些付不起avg的人少付的钱会抬高>avg的人的付费平均值,或许又会有人付不起这个新的avg,就是nowavg,所以循环这个过程,直到没有人付不起被抬高的avg。这样的话那些都能付得起新的avg的有钱人付的钱均相等,都是新的avg。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define num ch-'0'
#define ld long double
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
using namespace std;
const int N=;
ll cnt,n,m,a[N];
ld b[N],ans=,avg,tot,nowavg;
inline void get(ll &res)
{
char ch;bool flag=;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
}
int main()
{
get(n),get(m);
rep(i,,n) get(a[i]);
sort(a+,a+n+);
nowavg=avg=1.0*m/n;
tot=;
rep(i,,n)
{
if(a[i]<nowavg)
{
ans+=(a[i]-avg)*(a[i]-avg);
tot+=a[i];
}
else
{
nowavg=(m-tot)/(n-i+);
if(a[i]>=nowavg)
{
ans+=(nowavg-avg)*(nowavg-avg)*(n-i+);
break;
}
--i;
}
}
ans/=(ld)n;
ans=sqrt(ans);
printf("%.4Lf",(ld)ans);
return ;
}

谢谢大家!

最新文章

  1. js获取url以及截取后边所带参数
  2. mysql数据库迁移
  3. Latent Semantic Analysis (LSA) Tutorial 潜语义分析LSA介绍 一
  4. 对android中ActionBar中setDisplayHomeAsUpEnabled和setHomeButtonEnabled和setDisplayShowHomeEnabled方法的理解(转)
  5. Git学习(3)创建版本库
  6. Cyborg Genes
  7. ExecutorService与Executors例子的简单剖析
  8. Python环境变量设置
  9. ArrayBlockingQueue和LinkedBlockingQueue分析
  10. uCGUI字符串显示过程分析和uCGUI字库的组建
  11. [MySQL]快速解决&quot;is marked as crashed and should be repaired&quot;故障
  12. BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
  13. [补档][Jxoi2012] 奇怪的道路
  14. Python 项目实践三(Web应用程序)第三篇
  15. group()与groups()的区别
  16. thinkphp5源码解析(2)控制器
  17. node环境
  18. ETC的发展演变
  19. spring学习1
  20. Linux top命令中CPU信息的详解(转)

热门文章

  1. 卷积神经网络之ResNet网络模型学习
  2. Node.js的原型继承函数util.inherits
  3. springboot成神之——spring文件下载功能
  4. 自定义条件判断两对象相等Equals的方法
  5. VirtualBox 桥接
  6. Maven+Mybatis+Spring+SpringMVC实现分页查询
  7. Spring Cloud Eureka 2 (Eureka Server搭建服务注册中心)
  8. codeforce469DIV2——D. A Leapfrog in the Array
  9. ThinkPHP3.2 插入数据库数据,缓存问题
  10. android:gravity设置居中的问题