虚拟主机建站,江苏省建设考试培训网站,去黄山旅游攻略和费用,嘉兴路街道网站建设练习1--翻硬币
1#xff09;题目及要求 2#xff09;解题思路
输入的是字符串#xff0c;要想将两组字符串进行一一对比#xff0c;需要将字符串转换成字符数组#xff0c;再使用for循环依次遍历字符数组#xff0c;进行比对。
输入两行字符串#xff0c;转换成两个字…练习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 originscan.next();String targetscan.next();char[] originLineorigin.toCharArray();char[] targetLinetarget.toCharArray();int result0;for(int i0;ioriginLine.length-1;i){if(originLine[i]!targetLine[i]){originLine[i]originLine[i] *?o:*;originLine[i1]originLine[i1] *?o:*;result;}}scan.close();System.out.println(result);}
}
4本题核心 if(originLine[i]!targetLine[i]){originLine[i]originLine[i] *?o:*;originLine[i1]originLine[i1] *?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 stnew 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 avg1.0*s/n;double sum0;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_avgdouble cur_avg1.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(); } // ... (其余代码逻辑保持不变) }
} 输入和初始化 通过StreamTokenizer和BufferedReader从标准输入读取数据。nextInt()和nextLong()方法用于读取整数和长整数。初始化变量n人数、s总金额需求和a数组每个人持有的钱。 排序 使用Arrays.sort(a)对a数组进行排序以确保从小到大的顺序。这是贪心策略的一部分因为我们希望先使用钱较少的人来尽量接近平均值。 计算平均值 计算总需求s的平均值avg。 贪心选择 遍历排序后的a数组。对于每个人我们检查他们是否有足够的钱来支付平均值。 如果某人的钱不足以支付平均值即a[i] * (n - i) s那么他们会把所有的钱都拿出来。此时我们更新总需求s并计算这个人与平均值的差的平方累加到sum中。如果某人的钱足够支付平均值那么他们会支付平均值的金额而后面的所有人也都能至少支付这个金额。因此我们计算当前平均值与总平均值的差的平方并乘以剩余的人数(n - i)然后累加到sum中。之后我们跳出循环因为没有必要再检查后面的人。 计算标准差 使用公式Math.sqrt(sum / n)计算标准差并保留四位小数后输出。这里sum是每个人与平均值的差的平方的总和而n是人数。标准差是衡量这组数分布离散程度的指标。