Python入门习题(73)——OpenJudge百练习题:买手机

OpenJudge百练第4069号习题:买手机

题目描述

来源
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. 从一批手机里头,从好到差排序输出符合要求的手机的步骤是:
    (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])

测试用例

  1. 题目描述给出的测试用例有两组测试数据。第一组覆盖了全部手机都满足价钱要求的情形。第二组测试用例覆盖了有手机价钱过高的情形。
  2. 全部手机价钱都大于k的情形。
    样例输入
    1
    1700 3
    1 2000 3278 4
    2 1899 5666 5
    3 1799 5666 5
    样例输出
    (注:输出为空!!)

小结

  1. 对于组合关键字的排序,本题题解示范了Python手册推荐的排序方法。
  2. 本题中,首先对第三排序关键字排序,接着对第二排序关键字排序,然后对第一排序关键字排序。由于采用的排序算法具有稳定性,因此达成组合关键字排序的效果。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值