题目描述
来源
OpenJudge网站 – 百练习题集-第4069号习题
要求
总时间限制: 1000ms 内存限制: 65536kB
描述
有一天你想去网上买手机。各式各样可供选择的手机太多了,让你不知道该选哪一款,于是你决定看看各个型号的销售情况和其他人对该手机的评价。网站上可以得到手机的价格、销售量、其他用户对该手机的平均打分。在一番浏览之后,你决定在价格能承受的范围内,销售量越大的手机越好;销售量相同时,平均得分越高的手机越好;销售量和平均打分都相同时,价格越低越好。假设现在你有k元钱,给你n个手机的信息,给出你能买得起的所有手机,并按照上述的偏好从好到差排序输出。
一个手机有四个信息,都是非负整数,分别为产品id、价格、销售量、平均得分。四个属性取值都在10000以内。
输入
第一行是一个整数m,表示有m组试样例。
接下来m块,每块第一行是两个整数k和n,表示你有k元钱,有n个手机可购买。n不大于50。
接下来n行,每行是四个整数,用空格隔开,分别是一个手机的产品id、价格、销售量、平均得分。
输入保证没有价格、销售量、平均得分都相同的产品,且至少有一个买得起的产品。
输出
对于每组输入,输出该组你能买得起的所有手机的id,并按照上述的偏好从好到差排序。
样例输入
2
2000 3
1 2000 3278 4
2 1899 5666 5
3 1799 6003 5
1900 3
1 2000 3278 4
2 1899 5666 5
3 1799 5666 5
样例输出
3
2
1
3
2
解题思路
- 从一批手机里头,从好到差排序输出符合要求的手机的步骤是:
(1)对于价格上限k,选出价钱小于等于k的全部手机。
(2)以销售量、得分、价钱依次作为第一、第二和第三排序关键字进行排序。销售量和得分是降序排序,价钱则是升序排序。
参考答案
test_num = int(input())
for t in range(test_num):
k, n = [int(s) for s in input().split()]
phones = []
for i in range(n):
phone = [int(s) for s in input().split()]
if phone[1] <= k:
phones.append(phone)
phones.sort(key = lambda p: p[1]) #按价钱排序
phones.sort(key = lambda p: p[3], reverse=True) #按得分排序
phones.sort(key = lambda p: p[2], reverse=True) #按销售量排序
for p in phones:
print(p[0])
测试用例
- 题目描述给出的测试用例有两组测试数据。第一组覆盖了全部手机都满足价钱要求的情形。第二组测试用例覆盖了有手机价钱过高的情形。
- 全部手机价钱都大于k的情形。
样例输入
1
1700 3
1 2000 3278 4
2 1899 5666 5
3 1799 5666 5
样例输出
(注:输出为空!!)
小结
- 对于组合关键字的排序,本题题解示范了Python手册推荐的排序方法。
- 本题中,首先对第三排序关键字排序,接着对第二排序关键字排序,然后对第一排序关键字排序。由于采用的排序算法具有稳定性,因此达成组合关键字排序的效果。