java实现蓝桥杯 结账问题

2024-03-24 01:50
文章标签 java 实现 问题 蓝桥 结账

本文主要是介绍java实现蓝桥杯 结账问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  几个人一起出去吃饭是常有的事。但在结帐的时候,常常会出现一些争执。

  现在有 n 个人出去吃饭,他们总共消费了 S 元。其中第 i 个人带了 ai 元。幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出多少钱呢?

  为了公平起见,我们希望在总付钱量恰好为 S 的前提下,最后每个人付的钱的标准差最小。这里我们约定,每个人支付的钱数可以是任意非负实数,即可以不是1分钱的整数倍。你需要输出最小的标准差是多少。

  标准差的介绍:标准差是多个数与它们平均数差值的平方平均数,一般用于刻画这些数之间的“偏差有多大”。形式化地说,设第 i 个人付的钱为 bi 元,那么标准差为 :

输入格式

  从标准输入读入数据。

  第一行包含两个整数 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。


  资源约定:
  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms


  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  注意:
  main函数需要返回0;
  只使用ANSI C/ANSI C++ 标准;
  不要调用依赖于编译环境或操作系统的特殊函数。
  所有依赖的函数必须明确地在源文件中 #include <xxx>
  不能通过工程设置而省略常用头文件。

  提交程序时,注意选择所期望的语言类型和编译器类型。

 本体使用贪心算法求解

1.解法一

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] arge) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();double S = scanner.nextDouble();double a[] = new double[n];double WW=0;for (int i = 0; i < a.length; i++) {a[i] = scanner.nextDouble();}double avg = S / n;double avg2=avg;//  不能变化的avgint num = n;//当前还剩多少个Arrays.sort(a);for (int i = 0; i < a.length; i++) {if (a[i] < avg) { // 如果此时a[i]的值小于平均,则需要将其全部算上,并减去总的,需要更新angnum--;WW+=(a[i]-avg2)*(a[i]-avg2);                S=S-a[i];avg = (avg * (num + 1) - a[i]) / num;// 新的平均值} else if (a[i] == avg) {num--;WW+=(a[i]-avg2)*(a[i]-avg2);                avg = (avg * (num + 1) - a[i]) / num;} else {// 从这一个开始,后面所有的都大于平均值            	WW+=(avg-avg2)*(avg-avg2)*(a.length-i);             break;}}System.out.printf("%.4f",Math.sqrt(WW/n));}
}

2.解法二(来自y总)

AcWing 1235. 付账问题 - AcWing


import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] arge) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();double  S = scanner.nextDouble();double a[] = new double[n];double WW=0;for (int i = 0; i < a.length; i++)a[i] = scanner.nextDouble();Arrays.sort(a);double avg=S/n;for (int i = 0; i < a.length; i++) {double cur=S/(n-i);if (a[i]<cur) cur=a[i];WW+=(cur-avg)*(cur-avg);S-=cur;}System.out.printf("%.4f",Math.sqrt(WW/n));}
}

以上两种解法都不能拿满,主要是因为内存超限和精度问题。后续找到解决办法再来修改。

更新

上文内存超限和精度问题可以将存储每个人钱的数组改为int。


import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] arge) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();double S = scanner.nextDouble();int a[] = new int[n];double WW=0;for (int i = 0; i < a.length; i++) {a[i] = scanner.nextInt();}double avg = S / n;double avg2=avg;//  不能变化的avgint num = n;//当前还剩多少个Arrays.sort(a);for (int i = 0; i < a.length; i++) {if (a[i] < avg) { // 如果此时a[i]的值小于平均,则需要将其全部算上,并减去总的,需要更新angnum--;WW+=(a[i]-avg2)*(a[i]-avg2);                S=S-a[i];avg = (avg * (num + 1) - a[i]) / num;// 新的平均值} else if (a[i] == avg) {num--;WW+=(a[i]-avg2)*(a[i]-avg2);                avg = (avg * (num + 1) - a[i]) / num;} else {// 从这一个开始,后面所有的都大于平均值            	WW+=(avg-avg2)*(avg-avg2)*(a.length-i);             break;}}System.out.printf("%.4f",Math.sqrt(WW/n));}
}

这篇关于java实现蓝桥杯 结账问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840158

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1