Python入门习题(82)——OpenJudge百练习题:第二大价值

OpenJudge百练第4098号习题:第二大价值

  • 题目描述
  • 解题思路
  • 参考答案
  • 测试用例
  • 小结

题目描述

来源
OpenJudge网站 —— 百练习题集-第4098号习题

要求
总时间限制: 3000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB

描述

水果中含有多种营养物质。假设现在要通过营养物质含量多少来评价水果的价值,简单起见,只考虑其中两种营养物质A和B。给定一种水果A和B的含量a和b,用a+b的值作为该水果的价值。给定一组水果,要求这组水果中价值第二大的那个水果。

输入
第一行为m,表示有m组测试输入,m<100。
每组测试数据第一行为N,表示有N种水果,接着的N行每行三个非负整数,分别是水果ID、该水果的a和b。
(2<=N<=50)(输入保证没有价值相同的水果)
输出
输出价值第二大的水果ID以及对应的a、b和价值,共4个非负整数,中间用一个空格隔开。
样例输入
1
3
1 1 1
2 2 4
3 3 2
样例输出
3 3 2 5

解题思路

  1. 先据头两种水果预设第一大价值和第二大价值,分别用first和second来存储。
  2. 接着对后续水果f,如果价值大于first的营养价值,则令second = first, first=f;如果价值大于second(不大于first),则令second =f。最后得到的second就是解。

参考答案

m = int(input())
for t in range(m):
    N = int(input())
    
    #预设第一大和第二大
    id, a, b = [int(s) for s in input().split()]
    first = (id, a, b, a+b)
    id, a, b = [int(s) for s in input().split()]
    second = (id, a, b, a+b)
    if first[3] < second[3]:
        first, second = second, first

    for i in range(2, N):
        id, a, b = [int(s) for s in input().split()]
        if a+b > first[3]:
            second = first  #更新第二大
            first = (id, a, b, a+b) #更新第一大
        elif a+b > second[3]:
            second = (id, a, b, a+b)  #更新第二大
    print(second[0], second[1], second[2], second[3])

测试用例

  1. 题目描述给出的测试用例只有一组测试数据。水果有3种。

  2. 两组测试数据。第二组只有2中水果。
    样例输入
    2
    3
    1 1 1
    2 2 4
    3 3 2
    2
    2 2 4
    3 3 2
    样例输出
    3 3 2 5
    3 3 2 5

  3. 数据量稍大一点。

  4. 两组测试数据。第二组只有2种水果。
    样例输入
    2
    5
    1 1 1
    2 2 4
    3 3 2
    8 7 2
    5 3 1
    4
    2 2 4
    6 8 2
    3 3 2
    11 9 12
    样例输出
    2 2 4 6
    6 8 2 10

小结

  1. 题目只求第二大价值的水果,无须对全体水果按营养价值排序。题解采用的做法比排序效率更高,内存耗费更少。

你可能感兴趣的:(Python入门100道习题,Python编程)