19963: 买学区房
math, sortings, http://cs101.openjudge.cn/practice/19963
小明同学的家长为了让小明同学接受更好的教育,最近在考虑买某重点中学附近的房子,已知他们买房子要考虑两个因素:房子离学校的距离,以及房子的价格。现在他们有一系列备选的房子,已知这些房子距离学校的x方向距离和y方向距离,以及每栋房子的价格。小明的家长认为,只有同时满足了以下两个条件的房子H买了才是不亏的:
1.小明的家长比较精打细算,所以房子的性价比大于所有备选房子性价比的中位数(定义见下图) 2.小明的家长想攒钱,所以房子的价格小于所有备选房子价格的中位数
注: 性价比 = 房子和学校之间的交通距离 / 房子的价格 (由于该城市的街道布局接近方格状,且从学校到房子无法穿墙而过,房子H去学校的交通距离定义为,房子H距离学校的x方向距离和y方向距离的和)
现在需要你来帮小明的家长判断,一系列备选房子里,值得买的房子有多少栋。

输入
第1行为1个整数,n,代表备选房子的数目 第2行为n个房子离学校的x,y距离对,如“(x,y)”,距离均为整数 第3行为n个整数,代表每个房子的价格
输出
一个整数,代表n个房子中值得买的房子数目。
样例输入
Sample1 Input:
5
(100,200) (50,50) (100,300) (150,50) (50,50)
100 300 200 400 500
Sample1 Output:
2
说明:共有5个房子备选,离学校的交通距离分别是100+200=300,50+50=100,100+300=400,150+50=200,50+50=100。这些房子的性价比依次为300/100=3, 100/300=1/3, 400/200=2, 200/400=0.5, 100/500=0.2,中位数是0.5,满足第1个条件的只有第1个和第3个房子。这些房子的价格中位数是300,因此满足第2个条件的只有第1个和第3个房子。所以同时满足两个条件的有第1个和第3个房子,输出2.样例输出
Sample2 Input:
3
(10,90) (20,180) (30,270)
100 200 300
Sample2 Output:
0
说明:共有三个房子备选,离学校的交通距离分别是10+90=100,20+180=200,30+270=300。这些房子性价比依次为100/100=1,200/200=1,300/300=1,中位数是1,没有房子满足第1个条件,因此不用考虑第二个条件,输出一定是0.提示
求中位数,要先进行数据的排序(从小到大),然后计算中位数的序号,分数据为奇数与偶数两种来求.排序时,相同的数字不能省略. 如果总数个数是奇数的话,按从小到大的顺序,取中间的那个数. 如果总数个数是偶数的话,按从小到大的顺序,取中间那两个数的平均数.
同学发现测试数据结尾多空格。可以这样来接收数据: pairs = [i[1:-1] for i in input().split()] distances = [ sum(map(int,i.split(','))) for i in pairs]
来源:cs101 2019 Final Exam
statistics.median可以用来做 OJ 19963 学区房
import statistics
n = int(input())
distance = list(map(lambda x:sum(eval(x)),input().split()))
prize = list(map(int,input().split()))
average = list(distance[i]/prize[i] for i in range(n))
prize_median = statistics.median(prize)
average_median = statistics.median(average)
num = 0
for i in range(n):
if average[i] > average_median and prize[i] < prize_median:
num += 1
print(num)2020fall-cs101,李忠睿
n = int(input())
dis = [eval(x)[0]+eval(x)[1] for x in input().split()]
pri = [int(x) for x in input().split()]
vau = [dis[x]/pri[x] for x in range(n)]
def mid(n,lis):
lis = sorted(lis)
if n%2==1:
return lis[n//2]
else:
return (lis[n//2-1]+lis[n//2])/2
prim = mid(n, pri)
vaum = mid(n, vau)
sum = 0
for i in range(n):
if vau[i]>vaum and pri[i]<prim:
sum +=1
print(sum)n = int(input())
pairs = [i[1:-1] for i in input().split()]
distances = [ sum(map(int,i.split(','))) for i in pairs]
prices = [int(x) for x in input().split()]
# ratio = distance/price
r = []
for i in range(n):
r.append(distances[i]/prices[i])
H = zip(r,prices)
H = sorted(H, key=lambda x: (-x[0],x[1]))
#print(H)
prices.sort()
r.sort()
import math
if n%2 == 0:
rank = int(n/2)
price_sq = (prices[rank-1] + prices[rank])/2
r_sq = (r[rank-1] + r[rank])/2
else:
rank = math.ceil(n/2)
price_sq = prices[rank-1]
r_sq = r[rank-1]
cnt = 0
for h in H:
if h[0]>r_sq and h[1]<price_sq:
cnt += 1
print(cnt)