付账问题
本题求的是如何付款使方差最小,方差意味着一组数据的平稳程度,直接思路是这n个人,如果带的钱不够平均数,需要把钱全部付掉,那后一部分人,如何付款让方差最小?依然是带钱相对少的多付,相对多的少付的原则。
步骤:
对ai进行排序,
前一部分人带的钱不够,需要从总付款数S中扣掉他们的钱,得到剩余付款数S',
在剩余这部分人中,部分人带钱达不到平均数avg',需要他们全部付款,
剩下那部分带钱多的,不管怎么摊他都有富余,所以对于这部分人,付款数是剩余付款数平摊。
解答代码如下:
其中有几个细节提一下,
我们通过S<=a[i]*(n-i)来判断第i个人带的钱是否达到平均数avg,
题目规定n≤5×10^5,0≤ai≤10^9 ,2的10次幂约等于10的3次幂,2的32次幂约等于10的9次幂所以用int定义n,long定义存放ai的数组a,
Math.pow(n,m) 求n的m次方
Math.sqrt(n) 求算数平方根
System.out.println(String.format("%.4f", Math.sqrt(ans/n)));
也可以写成System.out.printf("%.4f", Math.sqrt(ans/n));
%f 表示接受一个数字并将其转化为浮点数格式
%d 表示接受一个数字并将其转化为有符号的整数格式
%.4f代表小数点后面有4位小数的浮点数。第二个例子%02d代表以固定的两位显示十进制数,不足的前面补0。而%2d前面没有指定0,不足两位时会以空白补足
成绩统计
Math.round()表示把数字四舍五入后保留整数,
Math.ceil()表示向上取整,不会自动转成整形,需要int强转
Math.floor()表示向下取整,不会自动转成整形,需要int强转
jige和youxiu两个变量需要定义成double再做除法计算
纸张大小
注意:substring 不是subString