当前位置: 首页 > news >正文

题:付账问题

1235. 付账问题 - AcWing题库

几个人一起出去吃饭是常有的事。

但在结帐的时候,常常会出现一些争执。

现在有 nn 个人出去吃饭,他们总共消费了 SS 元。

其中第 ii 个人带了 aiai 元。

幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出多少钱呢?

为了公平起见,我们希望在总付钱量恰好为 SS 的前提下,最后每个人付的钱的标准差最小。

这里我们约定,每个人支付的钱数可以是任意非负实数,即可以不是 11 分钱的整数倍。

你需要输出最小的标准差是多少。

标准差的介绍:标准差是多个数与它们平均数差值的平方平均数,一般用于刻画这些数之间的“偏差有多大”。

形式化地说,设第 ii 个人付的钱为 bibi 元,那么标准差为 :

输入格式

第一行包含两个整数 n、Sn、S;

第二行包含 nn 个非负整数 a1, …, ana1, …, an。

输出格式

输出最小的标准差,四舍五入保留 44 位小数。

数据范围

1≤n≤5×1051≤n≤5×105,
0≤ai≤1090≤ai≤109,
0≤S≤10150≤S≤1015。

输入样例1:

5 2333
666 666 666 666 666

输出样例1:

0.0000

输入样例2:

10 30
2 1 4 7 4 8 3 6 4 7

输出样例2:

0.7928

对于每个 a[i],若a[i]>s/n,那么这个人就出s/n的钱;若a[i]<s/n,那么这个人就出a[i]的钱,让剩余几人均摊s/n-a[i]的钱。

有了大体思路,这里可以用均值不等式来证明贪心策略最优(证明略)。

由于每个a[i]的值都会影响以后的决策,所以将s/n动态计算即可。

for(int i=0; i<n; i++){
    double cur = s/(n-i);//cur是当前应该均摊的钱数
    if(f[i]<cur) cur = f[i];
    s -= cur;//若钱够,则直接减去均摊的那一份;若不够,则让后面的人均摊差值
}

另外,由于给出的序列每个人的钱数有多有少,考虑一下极端情况,若钱数是降序,则前面钱多的不能均摊,后面钱少的无人均摊。所以按升序排列。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

const int N = 5e5+10;

int f[N];

int main(){
    int n;
    long double s;//由于数据范围是1e15,所以用到long double
    cin>>n>>s;
    for(int i=0; i<n; i++) scanf("%d",&f[i]);
    
    long double avg = s/n, ans = 0;
    
    sort(f,f+n);
    
    for(int i=0; i<n; i++){
        double cur = s/(n-i);
        if(f[i]<cur) cur = f[i];
        s -= cur;
        ans += pow(cur-avg,2);//求平方和,最后输出时计算一下方差
    }
    
    printf("%.4Lf", sqrt(ans/n));//long double输出使用Lf
    
    return 0;
}

相关文章:

  • python中的字典详解
  • C++11标准模板(STL)- 算法(std::minmax)
  • STM32F4 | PWM输出实验
  • Nginx快速入门笔记
  • Elasticsearch:基于文件的用户认证
  • 【C】带你复习有趣的函数
  • .NET Framework杂记
  • 4线SPI驱动OLED常规操作
  • ESP32 OTA
  • Linux C编程一站式学习笔记2
  • RK3568平台开发系列讲解(摄像头篇)使用 Camera 的步骤
  • Kerberos的概述和认证原理
  • RocketMQ的TAG过滤和SQL过滤机制
  • 2023年电气,电子与信息工程国际会议(ISEEIE 2023)
  • 【前端开发学习】4.JavaScript
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【Amaple教程】5. 插件
  • 0基础学习移动端适配
  • CentOS从零开始部署Nodejs项目
  • CSS相对定位
  • JAVA之继承和多态
  • markdown编辑器简评
  • PHP 小技巧
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Redis 中的布隆过滤器
  • spark本地环境的搭建到运行第一个spark程序
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 大数据与云计算学习:数据分析(二)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 思否第一天
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 提醒我喝水chrome插件开发指南
  • 积累各种好的链接
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 如何正确理解,内页权重高于首页?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #define、const、typedef的差别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (六)Hibernate的二级缓存
  • (论文阅读30/100)Convolutional Pose Machines
  • (顺序)容器的好伴侣 --- 容器适配器
  • (已解决)什么是vue导航守卫
  • (转)Linq学习笔记
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net 中viewstate的原理和使用
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)