4.题意大概是,
(1) 每次打印A中的最小值
(2) A中的数都减去(1)中打印的值
(3)循环(1)(2)k次
若A中没有最小值可以打印了,就打印0
输入:
n k
a
i
a_i
ai #n个
a
i
a_i
ai
7 5
5 8 10 3 6 10 8
输出:
3
2
1
2
2
【分析】也是比较简单,或许还是我练习不够的缘故吧,加油。
n=7;k=5
A=[5 ,8, 10, 3 ,6 ,10, 8]
A=sorted(list(set(A)))
i=0;a0=0
while i<k:
if(len(A))>0:
print(A[0]-a0)
a0=A[0]
A.pop(0)
else:
print(0)
i+=1
K=5
A=[5 ,8, 10, 3 ,6 ,10, 8]
n=len(A)
A=sorted(list(set(A)))
k=0;a0=0
for i in range(n):
if k<K:
a=A[i]-a0
if a==0:
pass
else:
print(a)
a0=A[i]
k+=1
else:
break
while k<K:
print(0)
2.两两配对
题意大概是:现在领导有m(m为偶数)个人,每两个人一起共同完成一个任务,完成任务的时间为两个人的时间权值之和,现在给出n行数据,每行数据有两个值x和y,代表有x个人的时间权值为y,求所有任务最快在什么时候都完成。
这道题有内存限制,之前是用了一个List来放所有的数,但是这些数若有重复的话,可能会超出内存限制。现在利用dict来做。主要的思路是,有m个任务,任务分配按照权值排序,最大和最小配对,次大和次小配对,…
S=int(raw_input()) # n m
dic={}
for n in range(S[0]):
tmp=map(int,raw_input().split(" ")) # x y表示x个人的时间权值是y
dic[tmp[1]]=tmp[0]
res=0
while len(dic)>0:
res=max(res,min(dic)+max(dic))
dic[min(dic)]-=1
dic[max(dic)]-=1
if dic[min(dic)]==0:
dic.pop(min(dic))
if len(dic)>0 and dic[max(dic)]==0:
dic.pop(max(dic))
print(res)
3.分组
题意:有n个人比赛,每个人都有一个权值,现在要将n个人分成两组,两组间的人数差<=1,问怎么分组可以使得两个组的人的权值和的差最小。