历年题解 CCF CSP历年题解(python)
样例输入:
6
2 6 5 6 3 5
4
3 4 6 7
5
3 4 6 6 7
题目链接:201612-1中间数
问题分析: 对数进行排序,若n为奇数且存在中间数,则中位数即为中间数,若为偶数且存在中间数,则中间两个数一定相同且为中间数
满分例程:
1.最优解:
n=int(input())
l=list(map(int,input().split()))
l.sort()
middle=int(n/2)
mi=0
ma=0
for i in range(n):
if l[i]<l[middle]:
mi+=1
elif l[i]>l[middle]:
ma+=1
if mi==ma:
print(l[middle])
else:
print(-1)
2.另一种做法:遍历列表,计算每个数再列表中对应大于和小于它的个数,若大于与小于的个数相等,即为中位数
n = int(input())
a = list(map(input().split()))
bo = 0
for i in range(n):
ma = 0
mi = 0
for j in range(n):
if a[i] > a[j]:
ma += 1
elif a[i] < a[j]:
mi += 1
if ma == mi:
bo = 1
break
if bo == 1:
print(a[i])
elif bo == 0:
print('-1')
3.另一种做法 [ 80分 ] :建立一个字典{数:数的个数},按数排序,stat为从左开始的索引,low为小于中位数的计数,fi为从右开始的索引,high为大于中位数的计数,循环n-2次,左右两边逐渐向中靠近
该程序使用字典相比于2降低了空间复杂度,时间复杂度就是stored的O(nlogn),比2也低,但模拟80分,朋友们发现错误可以留言,多谢
n=int(input())
l=list(map(int,input().split()))
s={}
for i in range(len(l)):
if l[i] not in s:
s[l[i]]=1
else:
s[l[i]]+=1
k=sorted(s.keys())
stat = 1
fi = 0
low=s[k[0]]
high=0
for i in range(1,len(k)-1):
if low>=high:
high+=s[k[len(k)-fi-1]]
fi+=1
else:
low+=s[k[stat]]
stat+=1
if low==high:
print(k[stat])
else:
print(-1)