贪心算法练习day1

news2024/12/23 10:59:37

练习1--翻硬币

1)题目及要求

2)解题思路

输入的是字符串,要想将两组字符串进行一一对比,需要将字符串转换成字符数组,再使用for循环依次遍历字符数组,进行比对。

输入两行字符串,转换成两个字符数组;将初始数组和目标数组进行逐个对比,运用三目运算符进行判断

3)详细代码

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        String origin=scan.next();
        String target=scan.next();
        char[] originLine=origin.toCharArray();
        char[] targetLine=target.toCharArray();
        int result=0;
        for(int i=0;i<originLine.length-1;i++){
          if(originLine[i]!=targetLine[i]){
            originLine[i]=originLine[i]== '*'?'o':'*';
            originLine[i+1]=originLine[i+1]== '*'?'o':'*';
            result++;
          }
        }
        scan.close();
        System.out.println(result);
    }
}

4)本题核心

 if(originLine[i]!=targetLine[i]){
            originLine[i]=originLine[i]== '*'?'o':'*';
            originLine[i+1]=originLine[i+1]== '*'?'o':'*';
            result++;
          }

练习2--付账

1)题目及要求

2)解题思路

让每个人尽可能付接近平均金额的钱数

根据金额和人数计算平均金额;对每个人的钱数进行从小到大排序;遍历排序后,将钱数少于平均金额的人 全部支付,再从总金额里减去该人所支付的金额;重新计算平均金额,剩余金额/剩余人数,同样钱数少于新平均金额的人也全部支付;最后钱最多的人支付剩余的。以此类推

3)详细代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;

/**
 * 贪心:为了使得标准差最小,每一个出的钱bi必须接近平均值s/n
 * [1]第i个人带的钱不够平均数avg,那么他只能出自己全部的钱ai
 * [2]第i个人带的钱比平均数avg多,那么他可以多付一些。
 *
 * 基本步骤如下:
 * 1、对ai从小到大排序
 * 2、排序后前一部分人的钱不够,那么就出他们所有的钱
 * 3、从总付钱数中扣除前一部分人出的钱,得剩余需要出得钱数为S',
 * 以及剩余得后一部分人的出钱平均数avg'
 * 4、后一部分人的钱多,他们多出一些:
 * (1)比较有钱的,但是他的钱也不够avg',那么他的钱也是全部出
 * (2)非常有钱的,不管怎么付他都有富余
 */
public class Main {
    public static StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public static void main(String[] args) throws IOException {
        int n = nextInt();
        long s = nextLong();
        long[] a = new long[n];

        //每个人带的钱数
        for (int i = 0; i <n ; i++) {
            a[i]=nextLong();
        }
        //开始贪心选择
        Arrays.sort(a);//排序,从小到大
        double avg=1.0*s/n;
        double sum=0;
        for (int i = 0; i <n; i++) {
            if(a[i]*(n-i)<s){   //把钱全部拿出的人
                sum+=(a[i]-avg)*(a[i]-avg);
                s-=a[i];    //更新还差多少钱
            }else{  //不需要把钱全部拿出的人。剩下的人中,钱最少的人都可以达到cur_avg
                double cur_avg=1.0*s/(n-i);//注意这里的s是还差多少钱
                //如果这个人有钱付,那么后面的人一定也能付,所以直接乘后面的人数(n - i)即可
                sum+=(cur_avg-avg)*(cur_avg-avg)*(n-i);
                break;
            }
        }
        System.out.printf("%.4f",Math.sqrt(sum/n));
    }
    public static int nextInt() throws IOException{
        st.nextToken();
        return (int)st.nval;
    }
    public static long nextLong() throws IOException{
        st.nextToken();
        return (long)st.nval;
    }
}

4)本题核心

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.Scanner;  
  
public class Main {  
    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        Scanner scanner = new Scanner(br);  
  
        int n = scanner.nextInt();  
        long s = scanner.nextLong();  
        long[] a = new long[n];  
  
        for (int i = 0; i < n; i++) {  
            a[i] = scanner.nextLong();  
        }  
  
        // ... (其余代码逻辑保持不变)  
    }  
}
  1. 输入和初始化

    • 通过StreamTokenizerBufferedReader从标准输入读取数据。
    • nextInt()nextLong()方法用于读取整数和长整数。
    • 初始化变量n(人数)、s(总金额需求)和a数组(每个人持有的钱)。
  2. 排序

    • 使用Arrays.sort(a)a数组进行排序,以确保从小到大的顺序。这是贪心策略的一部分,因为我们希望先使用钱较少的人来尽量接近平均值。
  3. 计算平均值

    • 计算总需求s的平均值avg
  4. 贪心选择

    • 遍历排序后的a数组。对于每个人,我们检查他们是否有足够的钱来支付平均值。
      • 如果某人的钱不足以支付平均值(即a[i] * (n - i) < s),那么他们会把所有的钱都拿出来。此时,我们更新总需求s,并计算这个人与平均值的差的平方,累加到sum中。
      • 如果某人的钱足够支付平均值,那么他们会支付平均值的金额,而后面的所有人也都能至少支付这个金额。因此,我们计算当前平均值与总平均值的差的平方,并乘以剩余的人数(n - i),然后累加到sum中。之后,我们跳出循环,因为没有必要再检查后面的人。
  5. 计算标准差

    • 使用公式Math.sqrt(sum / n)计算标准差,并保留四位小数后输出。这里,sum是每个人与平均值的差的平方的总和,而n是人数。标准差是衡量这组数分布离散程度的指标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客——IncDec Sequence(差分)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给定一个长度为 n(n≤105)(n \leq 10^5 )(n≤105) 的数列a1,a2,…,an{a_1,a_2,…,a_n}a1​,a2​,…,an​&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使下标在这个区间内的数…

驾驭AI绘画:《AI魔法绘画》带你秒变顶级画手!

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

1.2.1 相机模型—内参、外参

相机模型-内参、外参 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git&#xff09; 针孔相机模型&#xff0c;包含四个坐标系&#xff1a;物理成像坐标系、像素坐标系、相机坐标系、世界坐标系。 相机参数包含&…

最适合初学者的Python入门详细攻略,一文讲清,赶紧收藏!

前言 目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广泛&#xff0c;工资也挺高&#xff0c;未来发展也极好。 Python究竟应该怎么学呢&#xff0c;我自己最初也是从零基础开始学习Python的&#xff0c;给大家分享Python的学习思路和方法。一味的买…

UI风格汇:毛玻璃风格风靡的原因解读

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的是毛玻璃风格的解读&#xff0c;有设计需求可以私聊。 一、什么是毛玻璃风格 毛玻璃风格&#xff08;Fros…

论文阅读:MotionNet基于鸟瞰图的自动驾驶联合感知和运动预测

MotionNet: Joint Perception and Motion Prediction for Autonomous Driving Based on Bird’s Eye View Maps MotionNet&#xff1a;基于鸟瞰图的自动驾驶联合感知和运动预测 论文地址&#xff1a;MotionNet: Joint Perception and Motion Prediction for Autonomous Drivi…

Linux——系统文件I/O

系统文件I/O 注&#xff1a;学习本次内容之前&#xff0c;最好先对C语言文件操作有所了解 本章思维导图&#xff1a; 注&#xff1a;思维导图对应的.xmind文件和.png文件都已同步导入至资源&#xff0c;可供免费查阅 在以前学习的C语言中&#xff0c;我们可以通过fwrite和fre…

Ansible file文件模块 设置文件的属性,比如创建文件、创建链接文件、删除文件

目录 语法创建目录创建链接文件删除文件 每个值的属性 语法 创建目录 ansible slave -m file -a path/data/app statedirectory path/data/app # 定义创建路径 statedirectory # 如果目录不存在就创建目录这就是创建目录成功之后的回显 可以看到&#xff0c;已经打印出目录a…

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段&#xff0c;不仅仅是智慧交通、智慧环保&#xff0c;如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢&#xff0c;正在通过信息化、数字化和智慧化的方式&#xff0c;实现全方位的精细化管理。本文以智慧公厕源头专…

Ubuntu忘记登录密码重置步骤

Ubuntu忘记登录密码重置步骤 1.开机界面长按shitf键&#xff0c;进入grub&#xff0c;并选择Advanced options for ubuntu&#xff0c;按下回车 2.选择一个较新版本的recovery mode&#xff0c;按下回车 3.会跑一些数据&#xff0c;等待跑完后会出现下面的界面&#xff0c;选择…

pm2常用命令有哪些?

PM2 是一个流行的 Node.js 进程管理工具&#xff0c;用于管理和监控 Node.js 应用程序。以下是一些常用的 PM2 命令&#xff1a; 启动应用程序&#xff1a; pm2 start app.js这将启动名为 app.js 的 Node.js 应用程序。 列出所有应用程序&#xff1a; pm2 list这将列出当前所有…

牛客小白月赛87

A 思路&#xff1a;贪心。将数列倒序分别计算两人的和即可。 #include <bits/stdc.h> using namespace std; int a[110]; void solve() {int n;cin>>n;int sum10,sum20;int flag1;for (int i1;i<n;i) cin>>a[i];for (int in;i>1;i--){if(flag1){sum1a…

阿里云服务器租用收费标准价格表(2024年更新)

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

OpenCV中的边缘检测技术及实现

介绍: 边缘检测是计算机视觉中非常重要的技术之一。它用于有效地识别图像中的边缘和轮廓&#xff0c;对于图像分析和目标检测任务至关重要。OpenCV提供了多种边缘检测技术的实现&#xff0c;本博客将介绍其中的两种常用方法&#xff1a;Canny边缘检测和Sobel边缘检测。 理论介…

第三节作业:基于 InternLM 和 LangChain 搭建你的知识库

参考文档&#xff1a;https://github.com/InternLM/tutorial/tree/main/langchain 基础作业&#xff1a;复现课程知识库助手搭建过程 (截图) 1.环境配置 2.知识库搭建 &#xff08;1&#xff09;数据收集 收集由上海人工智能实验室开源的一系列大模型工具开源仓库作为语料库来…

Mybatis——Javaweb进阶学习(五)

目录 一、Mybatis快速入门1.创建Springboot工程&#xff0c;数据库表user&#xff0c;实体类User2.引入Mybaties相关依赖3.编写Sql语句 二、lombok1.基本概念2.使用方法 三、基础操作1.环境准备a.数据库准备b.创建员工实体类Emp数据类型对比命名对比 c.Mapper接口创建 2.删除操…

EasyRecovery2024功能强大的电脑数据恢复软件

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;支持从各种存储介质中恢复丢失或删除的文件。以下是EasyRecovery的下载教程、功能介绍以及最新版本简介&#xff1a; EasyRecovery支持多种操作系统版本。对于Windows系统&#xff0c;它支持Windows XP、Windows Vista、W…

智能网卡(SmartNIC):增强网络性能

在当今的数字时代&#xff0c;网络性能和数据安全是各行各业面临的关键挑战。智能网卡是一项颠覆性的技术创新&#xff0c;对增强网络性能和加强数据安全性具有关键推动作用。本文旨在探讨智能网卡的工作原理及其在不同应用场景中的重要作用。 什么是智能网卡&#xff1f; 智…

QtApplets-线程池

QtApplets-线程池 ​ 今天咱们稍微看下Qt的线程池。QThreadPool&#xff0c;浅浅搞一下。 文章目录 QtApplets-线程池QThreadPoolQThreadPool 与 QThread 区别替代方案Qt Concurrent QThreadPool 与 Qt Concurrent 区别Demo运行效果 ☞ 源码 关键字&#xff1a; Qt、QRunnable…

Netty中的适配器、Handler共享和资源管理

ChannelHandler的适配器 有一些适配器类可以将编写自定义的ChannelHandler所需要的工作降到最低限度&#xff0c; 因为它们提供了定义在对应接口中的所有方法的默认实现。因为有时会忽略那些不感兴趣的 事件&#xff0c;所以Netty提供了抽象积累ChannelInboundHandlerAdapter(…