1095 解码PAT准考证 python

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 08:23   75   0

1095 解码PAT准考证 (25 分)

PAT 准考证号由 4 部分组成:

  • 第 1 位是级别,即 T 代表顶级;A 代表甲级;B 代表乙级;
  • 第 2~4 位是考场编号,范围从 101 到 999;
  • 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
  • 最后 11~13 位是考生编号,范围从 000 到 999。

现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。

输入格式:

输入首先在一行中给出两个正整数 N(≤104)和 M(≤100),分别为考生人数和统计要求的个数。

接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [0,100] 内的整数),其间以空格分隔。

考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令,其中

  • 类型 为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的 指令 则给出代表指定级别的字母;
  • 类型 为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的 指令 则给出指定考场的编号;
  • 类型 为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的 指令 则给出指定日期,格式与准考证上日期相同。

输出格式:

对每项统计要求,首先在一行中输出 Case #: 要求,其中 # 是该项要求的编号,从 1 开始;要求 即复制输入给出的要求。随后输出相应的统计结果:

  • 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
  • 类型 为 2 的指令,按 人数 总分 的格式输出;
  • 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。

如果查询结果为空,则输出 NA

输入样例:

8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999

输出样例:

Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA

研究了一上午,也只对了测试样例的那个测试点,不过这一个点15分,就这样吧。。测试0正确,1非零,2错误,3和4超时

大题上思路应该是可以做下去的,边界值特殊情况没考虑

一个半月以前还完全不会做这道题呢

N,M=[int(x) for x in input().split()]

ls=[]
for i in range(N):
    ls.append(input().split())

case_c={}
for i in range(M):
    case_c[i+1] = input().split()

dic1={} #case1 key=考号 values=分数
dic2={} #case2 key=考场号 values=人数
dic3={} #case3 key=考场号 values=人数
dic1_1={}  #key=1,2,3... values=考号
dic1_2={}  #key=1,2,3... values=分数
dic3_1={}  #和dic1_1、dic1_2类似功能
dic3_2={}
for i in range(M):
    print('Case {}: {} {}'.format(i+1,case_c[i+1][0],case_c[i+1][1]))
    if case_c[i+1][1]=='A' or case_c[i+1][1]=='B' or case_c[i+1][1]=='T':
        for j in ls:            
            if j[0][0]==case_c[i+1][1]:
                dic1[j[0]]=int(j[1])
        f=zip(dic1.values(),dic1.keys())
        y = sorted(f,reverse=True)
        ls_case1=list(y)
        
        for a in range(len(ls_case1)):
            dic1_1[a+1]=ls_case1[a][0]
        for b in range(len(ls_case1)):
            dic1_2[b+1]=ls_case1[b][1]
        print(dic1_2)
        for k in dic1_1:
            try:
                if dic1_1[k]==dic1_1[k+1] :
                    if dic1_2[k] > dic1_2[k+1]:
                        mi=dic1_2[k+1]
                    else:
                        mi=dic1_2[k]

                    print(mi,dic1_1[k])
                else:
                    print(dic1_2[k],dic1_1[k])
            except:

                print(dic1_2[k-1],dic1_1[k])
        

    if len(case_c[i+1][1]) == 3:
        cnt_g=0 #计算总分
        cnt=0 #计算人数
        for j in ls:
            if j[0][1:4] == case_c[i+1][1]:
                cnt_g += int(j[-1])
                cnt +=1
        if cnt>0:
            print(cnt,cnt_g)
        else:
            print('NA')

    if len(case_c[i+1][1]) == 6:        
        for j in ls:
            if j[0][4:10] == case_c[i+1][1]:
                if j[0][1:4] not in dic3:
                    dic3[j[0][1:4]]=1
                else:
                    dic3[j[0][1:4]] += 1        
        z = zip(dic3.values(),dic3.keys())
        y = sorted(z,reverse=True)
        ls_case3=list(y)
        for a in range(len(ls_case3)):
            dic3_1[a+1]=ls_case3[a][0]
        for b in range(len(ls_case3)):
            dic3_2[b+1]=ls_case3[b][1]
        for k in dic3_1:
            try:
                if dic3_1[k]==dic3_1[k+1] :
                    if dic3_2[k] > dic3_2[k+1]:
                        mi=dic3_2[k+1]
                    else:
                        mi=dic3_2[k]
                    print(mi,dic3_1[k])
                else:         
                    print(dic3_2[k-1],dic3_1[k])
            except:
                print(dic3_2[k],dic3_1[k])

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP