- 倍数问题(2018A10)
- 平方和(2019A1 )
倍数问题
感觉这题就在考用数学分析问题的能力。
如果每个人带的钱都足够,那就AA了,每个人都付avg=s/n一样多。
但是题目中会有钱不够的人。
我们可以分为两部分人:
1.有一些人带的钱不够AA,可以分为两种情况:
(1)第i个人带的不够avg,那他出带的所有钱。
(2)剩下的人就是够avg的人,要多摊一点。计算new_avg=剩余需要支付的钱数/要多摊钱的人数,如果某人是要多摊的,但不够new_avg,那他也需要出他带的所有钱。
这部分人,就是出自己全部带的钱。
2.最后,剩下的人就是要多摊钱的,并且都能AA分的有钱人,每个人需要支付=剩下的支付钱数/人数。
注意,可以先对ai从小到大排序,再去看每个人的钱够不够。
公式要学会变形一下,就不会那么复杂,看出可以去掉两个求和及嵌套。
n,s=map(int,input().split())
a=list(map(int,input().split()))
avg=s/n
sum=0.0
a.sort()
for i in range(n):
if a[i]*(n-i)<s:#两类人:1钱不够,2钱够但不是很够。用上自己所有钱
sum+=pow(a[i]-avg,2)
s=s-a[i]
else:#钱很够的人,随便怎么分,就每个人AA吧
new_avg=s/(n-i)
t=new_avg-avg
sum+=pow(t,2)*(n-i)
break
x=pow(sum/n,1/2)
print("{:.4f}".format(x))
补充:
map()用法
map(function,iterable,…)
1.function-函数
2.iterable-一个或多个序列
n,s=map(int,input().split())作用是输入两个整数,中间以空格隔开,分别赋值给n,s。这里的map()将列表(由字符串分割后返回)里每个元素调用函数int()使转换为整型。
sort()、sorted()区别
sort()因为是List的一个方法,所以对列表本身的顺序会改变,返回值为空。
list.sort(key=None,reverse=False)
#将 list 自身进行排序,不返回新的 list 对象,默认升序; reverse:-True 降序 -False正序
sorted()是全局方法,所以不会对数据结构做改变,而返回一个已排序的新列表。
sorted<iterable,key=None,reverse=False>
#返回排好序的新列表,不改变对象本身,默认升序; reverse:-True 降序 -False 正序。对所有可迭代的对象均有效
平方和
对于这类数字问题,适合用python解决,十分方便。
如果要用c/c++解决,遍历时就不能直接看2,0,1,9的其中一个数字在不在这个数字i中,而是要将数字i的个位,十位,百位…计算出来,看有没有2,0,1,9,如果有,再进行计算加入sum,没有就去遍历下个数。
sum=0
for i in range(1,2020):
s=str(i)
if '2' in s or '0' in s or '1' in s or '9' in s:
sum+=i*i
print(sum)
若要将i的每个位置上的数算出,判断是不是符合的数,c++的部分代码如下:
while(i){
if(i%10==1||i%10==2||i%10==9||i%10==0)
return true;
i/=10;
}
return false;