Python:最少刷题数

135 篇文章 19 订阅
9 篇文章 0 订阅

问题描述

小蓝老师教的编程课有 N 名学生, 编号依次是 1…N 。第 i 号学生这学期 刷题的数量是 Ai​ 。

对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。

输入格式

第一行包含一个正整数 N 。

第二行包含 N 个整数: A1​,A2​,A3​,…,AN​.

输出格式

输出 N 个整数, 依次表示第 1…N 号学生分别至少还要再刷多少道题。

样例输入

5
12 10 15 20 6

样例输出

0 3 0 0 7

评测用例规模与约定

对于 30% 的数据,  1 ≤ N ≤ 1000,0 ≤ Ai​ ≤ 1000.

对于 100% 的数据, 1 ≤ N ≤ 100000,0 ≤ Ai​ ≤ 100000.

思路:

例:12 10 15 14 6

A123456789101112131415
B000001000101011
C000001111223345

B:代表样例中所有的刷题个数

刷题数目比自己小的人数不少于成绩比刷题数目自己大的人数的最小刷题数。 用数组记录每个成绩出现的次数 ,然后维护成绩的前缀和,并遍历遍历数组,如果当前刷题数目比自己小的人数不少于刷题数目比自己大的人数 ,我们把此类学生定义为合法学生,即不用进行任何操作就可以满足要求。
反之,我们要分析不合法学生变成合法学生的最小刷题数,首先我们要找到一个当前刷题数目比自己小的人数多于刷题数目比自己大的合法学生的最小刷题数目,定义为通过刷题可以成为合法学生的所需的最小成绩。

参考代码:

num = int(input())
lis = list(map(int,input().split()))
maxn = max(lis)
N=100001
cnt = [0 for i in range(N)]
for i in range(num):
  cnt[lis[i]]+=1
for i in range(1,N):
  cnt[i] += cnt[i-1]
pos = -1
pos1 = -1
for i in range(1,N):
  if cnt[i-1] >= num - cnt[i]:   #不用刷题
    if pos1 == -1 :
      pos1 = i
  if cnt[i-1] - 1 >= num - cnt[i]: #需要刷题
    if pos == -1:
      pos = i
      break
if pos == -1:
  for i in range(num):
    print(0,end = ' ')
else:
  for i in range(num):
    if lis[i] >= pos1:
      print(0,end = ' ')
    else:
      print(pos-lis[i],end = ' ')

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值