题:
华老师的n个学生参加了一次模拟测验,考出来的分数很糟糕,但是华老师可以将成绩修改为[0,100]中的任意值,所以他想知道,如果要使所有人的成绩的平均分不少于X分,至少要改动多少个人的分数?
输入:
第一行一个数T,共T组数据(T≤10)
接下来对于每组数据:
第一行两个整数n和X。(1≤n≤1000, 0≤X≤100)
第二行n个整数,第i个数Ai表示第i个学生的成绩。(0≤Ai≤100)
输出:
共T行,每行一个整数,代表最少的人数。
思路:
使用while循环,avg<x就执行循环,否则跳出循环。为了次数少,找出里面最小的数,将它改成最高分就行,每次操作次数增加1。
代码如下:
import numpy as np
n = int(input())
z = 0
for i in range(n):
list1 = list(map(int, input().split()))
list2 = list(map(int, input().split()))
while np.mean(list2) < list1[1]:
print(np.mean(list2))
a = min(list2)
b = list2.index(a)
list2[b] = 100
z = z + 1
print(z)
z = 0
题2:
有n个杀手排成一行,每个杀手都有一个不同的编号(编号为1-n),在每个夜晚,杀手都会行动,如果某个杀手编号大于他右边的杀手的编号,他就会杀死他右边的杀手,杀手的行动是瞬间的,因此一个人可能某一个演完既杀死了别人,又被别人杀死了,例如3,2,1这个顺序,在第一个夜晚2会杀死1,同时3会杀死2.显然易见,一段时间之后,就不会有人杀死或者被杀了,平安夜也就来了,请问在平安夜之前有多少个夜晚?
输入:
第一行是一个整数n(1<=n<=100000),表示杀手的数量。 接下来一行有n个数,是一个1-n的全排列。
输出:
输出包含一个整数,表示平安夜之前经历个多少了夜晚。
思想:
[4,3,2,1]变成[[4,3],[3,2],[2,1]]。遍历每个子集,只有左边>右边,记下右边在原list里的位置。倒序需要删除的位置(从后往前删),在原list里删除这些位置的数,并计数1次。只要需要删除不为空就一直循环,循环到需要删除的为空结束。输出是计数次数减1,因为最后一次操作实际未输出(需要删除的为空)。
代码:
n = int(input())
list1 = list(map(int,input().split()))
num = 1
list2 = []
list3 = []
z = 0
while num > 0:
for i in range(len(list1)-1):
a = [list1[i],list1[i+1]]
list2.append(a)
for i2 in range(len(list1)-1):
if list2[i2][0] > list2[i2][1]:
list3.append(i2+1)
else:
pass
list3 = list(set(list3))
num = len(list3)
list3.sort(reverse=True)
for i3 in list3:
list1.pop(i3)
z = z + 1
list2 = []
list3 = []
print(z-1)