蓝桥杯刷题

  1. 倍数问题(2018A10)
  2. 平方和(2019A1 )

倍数问题

蓝桥杯2018A10
感觉这题就在考用数学分析问题的能力。
如果每个人带的钱都足够,那就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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值