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. 本题中,首先对第三排序关键字排序,接着对第二排序关键字排序,然后对第一排序关键字排序。由于采用的排序算法具有稳定性,因此达成组合关键字排序的效果。

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

  1. Python入门习题大全——数字 8

    Python入门习题大全--索引 编写4个表达式,它们分别使用加法.减法.乘法和除法运算,但结果都是数字8.为使用print语句来显示结果,务必将这些表达式用括号括起来,也就是说,你应该编写4行类似于 ...

  2. Python入门习题大全——词汇表2

    Python入门习题大全--索引 既然你知道了如何遍历字典,现在请整理你为完成上一个例题而编写的代码,将其中的一系列 print 语句替换为一个遍历字典中的键和值的循环.确定该循环正确无误后,再在词汇 ...

  3. Python入门习题大全——词汇表

    Python入门习题大全--索引 Python 字典可用于模拟现实生活中的字典,但为避免混淆,我们将后者称为词汇表. 想出你在前面学过的5个编程词汇,将它们用作词汇表中的键,并将它们的含义作为值存储在 ...

  4. Python入门习题大全——大号T恤

    Python入门习题大全--索引 修改函数上一个"T恤"例题中的make_shirt(),使其在默认情况下制作一件印有字样"I lovePython"的大号T恤 ...

  5. Python入门习题大全——T恤

    Python入门习题大全--索引 编写一个名为make_shirt()的函数, 它接受一一个尺码以及要印到T恤上的字样.这个函数应打印一个句子,概要地说明T恤的尺码和字样. 使用位置实参调用这个函数来 ...

  6. Python入门习题大全——猫和狗

    Python入门习题大全--索引 创建两个文件cats.txt 和dogs.txt,在第一个文件中至少存储三只猫的名字,在第二个文件中至少存储三条狗的名字.编写一个程序,尝试读取这些文件,并将其内容打 ...

  7. Python入门习题大全——人生的不同阶段

    Python入门习题大全--索引 设置变量 age 的值,再编写一个 if-else-else 结构,根据 age 的值判断处于人生的哪个阶段. 如果一个人的年龄小于 2 岁,就打印一条消息,指出他是 ...

  8. Python入门习题大全——检查用户名

    Python入门习题大全--索引 按下面的说明编写一个程序,模拟网站确保每位用户的用户名都独一无二的方式. 创建一个至少包含5个用户名的列表,并将其命名为current_users. 再创建一个包含5 ...

  9. Python入门习题大全——喜欢的水果

    Python入门习题大全--索引 创建一个列表,其中包含你喜欢的水果,再编写一系列独立的 if 语句,检查列表中是否包含特定的水果. 将该列表命名为 favorite_fruits,并在其中包含三种水 ...

  10. Python入门习题大全—— 3 的倍数

    Python入门习题大全--索引 创建一个列表,其中包含 3 ~ 30 内能被 3 整除的数字:再使用一个 for 循环将这个列表中的数字都打印出来. # 3 的倍数 san = [value for ...

最新文章

  1. php 去除中英文空格,php去除字符串首尾中英文空格程序-PHP源码
  2. 项目2---机柜和物理服务器
  3. python在日常工作处理中的应用-近期工作中应用Python的一些经验总结
  4. android tools ignore,android 中tools:ignore=UselessParent这个属性的含义是什么?
  5. 牛客题霸 NC21 链表内指定区间反转
  6. c语言数值运算法和非数值运算法,数据结构(c语言)1.数据结构是一门研究非数值计算的程序设计问题中计算机的 以及它们之间的 _ 和运算等的学科。① A....
  7. 详解python3如何调用c语言代码
  8. [c++] - 简单的冒泡
  9. java知识回顾_Java – 2012年回顾和未来预测
  10. jQuery 事件 - ready() 方法
  11. 数据结构和算法之排序一:归并排序
  12. 【转载】web.xml中的classpath和classpath*
  13. salt把返回写入到mysql
  14. mysql 物理删除 索引_MySQL 索引重建
  15. Git--分布式版本控制系统
  16. Hibernate中Java对象的生命周期
  17. html中如何显示emf图片,emf是什么格式
  18. 计算机的用户账户,计算机用户名是什么意思(如何修改和设置用户名)
  19. java 数组定义是必须指定长度吗
  20. debian下安装小企鹅输入法

热门文章

  1. Arrays类讲解:
  2. 基于VB算法+Picture+Timer控件制作的39种动画效果,类似屏保(完整原程序) (转)
  3. 路由器动态ip获取不到怎么办?
  4. 音视频学习-直播助手内存优化
  5. 联想潮7000怎么安装Java_联想2018款小新潮7000-15笔记本安装win7系统操作教程
  6. 【Linux】如何关闭Linux防火墙
  7. 搭建JavaWeb开发环境(Eclipse版)
  8. java面试总结点(1)
  9. java matcher方法_9 Matcher 类的方法 - Java 正则表达式教程
  10. Unity 修改材质球的属性为透明