> 文档中心 > 排序问题3.14

排序问题3.14


1.最小字符串 

问题描述

  给定一些字符串(只包含小写字母),要求将他们串起来构成一个字典序最小的字符串。

输入格式

  第一行T,表示有T组数据。
  接下来T组数据
  每组第一行一个正整数n,表示字符串个数。
  接下来n行,每行一个字符串(长度不超过100)。

输出格式

  T行,每行一个字符串。

样例输入

1
3
a
b
c

样例输出

abc

数据规模和约定

  T<=7000,n<=100;

 用到了functools中的cmp_to_key(cmp)来排序

 结构体排序

from functools import *def cmp(s1, s2):  if s1 + s2 > s2 + s1:    return 1#换  else:    return -1#不换n=int(input())for i in range(n):     a=[]     b=[]     t=int(input())     for j in range(t):   a.append(input())     a=sorted(a,key=cmp_to_key(cmp))     s=''.join(a)     print(s)

 2.统计数字

题目描述

某次科研调查时得到了 n 个自然数,每个数均不超过 (1.5×10^9)。已知不相同的数不超过 10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

输入描述

第 1 行是整数 n,表示自然数的个数。

第 2∼n 行每行一个自然数。

其中,1≤n≤2×10^5,每个数均不超过 1.5≤10^9,每个数均不超过1.5≤10^91.5≤109。

输出描述

输出 m 行( m 为 n 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

样例输入

8242451002100

样例输出

2 34 25 1100 2 

用到了字典 

n = int(input())nums = {}for i in range(n):    x = int(input())    if x in nums.keys(): nums[x] += 1    else: nums[x] = 1key = list(nums.keys())key.sort()for k in key:    print(k, nums[k])

3.错误票据 

题目描述

某涉密单位下发了某种票据,并要在年终全部收回。

每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。

因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。

你的任务是通过编程,找出断号的 ID 和重号的 ID 。

假设断号不可能发生在最大和最小号。

输入描述

输入描述

要求程序首先输入一个整数 N (N<100)表示后面数据行数。

接着读入 N 行数据。

每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于10^5)。

输出描述

要求程序输出 1 行,含两个整数 m,n,用空格分隔。

其中,m 表示断号ID,n 表示重号 ID。

输入输出样例 

示例

输入

25 6 8 11 910 12 9

输出

7 9
n = int(input())p = []for i in range(n):    num = input().split()    for j in range(len(num)): p.append(int(num[j]))p.sort()a = p[0]b = a+len(p)for i in range(a,b):    if i not in p: m = i    if p.count(i)==2: n = iprint(m,n)

4.奖学金

结构体排序

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前 5 名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:

7 2795 279这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和),但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 2797 279

则按输出错误处理,不能得分。

输入描述

第 1 行为一个正整数 n (6≤n≤300),表示该校参加评选的学生人数。

第 2 到 n+1 行,每行有 3 个用空格隔开的数字,每个数字都在 0 到 100之间。第 j 行的 3 个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1 ~ n(恰好是输入数据的行号减 1)。

所给的数据都是正确的,不必检验。

输出描述

输出共有 5 行,每行是两个用空格隔开的正整数, 依次表示前 5 名学生的学号和总分。

样例输入

690 67 8087 66 9178 89 9188 99 7767 89 6478 89 9样例输出6 2654 2643 2582 2441 237 
from functools import *def cmp(a,b):    if a[3]>b[3]: return 1    if a[3]b[0]:     return 1 if a[0]b[4]:  return 1     else:  return -1n=int(input())s=[]for i in range(n):    num=list(map(int,input().split()))    b=sum(num)    num.append(b)    num.append(i+1)    s.append(num)s=sorted(s,key=cmp_to_key(cmp),reverse=True)for i in range(5):    print(s[i][4],s[i][3])

5.外卖店优先级 

1.先把各个订单按照时间排序

2.在遍历时,

a.先减去没有外卖订单时间的优先级,方法:看上一个订单的时刻,与现在时刻相减+1

b.判断优先级是否小于0,如果小于0,就让他等于0

c.判断优先级是否小于3,如果小于3,就把标记改为1

d.再让优先级+2,判断是否大于5,如果大于5,打标记

e.把这一时刻存入id的last time中

3.再重新遍历,判断是否有last time 不是最后时刻的,就让他与此时刻相减,判断是否小于3,该标记,

maxn = 100010vis = [0] * maxnscore = [0] * maxnlast = [0] * maxnn, m, T = list(map(int, input().split()))a = []for i in range(m):    t, id = list(map(int, input().split()))    a.append([t, id])a = sorted(a,key=lambda s:s[0])for every in a:    now_time = every[0]    now_id = every[1]    if now_time != last[now_id]: score[now_id] -= (now_time - last[now_id] - 1)    if score[now_id] < 0: score[now_id] = 0    if score[now_id]  5: vis[now_id] = 1    last[now_id] = now_timeans = 0for i in range(1, n + 1):    if last[i] < T: score[i] -= T - last[i] if score[i] <= 3:     vis[i] = 0    ans += vis[i]print(ans)

 

 

 

 

 

医学名词百科