PAT 1059 C语言竞赛 python(无超时)

1059 C语言竞赛 (20 分)

C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:

  • 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
  • 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
  • 2、其他人将得到巧克力。

给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。

输入格式:

输入第一行给出一个正整数 N(≤104),是参赛者人数。随后 N 行给出最终排名,每行按排名顺序给出一位参赛者的 ID(4 位数字组成)。接下来给出一个正整数 K 以及 K 个需要查询的 ID。

输出格式:

对每个要查询的 ID,在一行中输出 ID: 奖品,其中奖品或者是 Mystery Award(神秘大奖)、或者是 Minion(小黄人)、或者是 Chocolate(巧克力)。如果所查 ID 根本不在排名里,打印 Are you kidding?(耍我呢?)。如果该 ID 已经查过了(即奖品已经领过了),打印 ID: Checked(不能多吃多占)。

输入样例:

6
1111
6666
8888
1234
5555
0001
6
8888
0001
1111
2222
8888
2222

输出样例:

8888: Minion
0001: Chocolate
1111: Mystery Award
2222: Are you kidding?
8888: Checked
2222: Are you kidding?

作者: CHEN, Yue
单位: 浙江大学
时间限制: 200 ms
内存限制: 64 MB
代码长度限制: 16 KB

问题分析:
更新:
超时问题解决了!
新代码在最下方!
事实证明 set、dict 的查询速度,真的是比 list 要快的
·
·
--------------------------------------我-是-分-割-线----------------------------------------
emmmmm
2、3测试点超时,真的是没想明白为什么
之前怀疑是因为素数计算时间过长
所以直接将10000以内的素数列出进行计算,依旧超时

代码:

n = int(input())
winners_list = []
for i in range(n):
    winners_list.append(input())

prime = []
if n < 10:
    n = 10
flag = [1] * (n + 2)
p = 2
while p <= n:
    prime.append(p)
    for i in range(2 * p, n + 1, p):
        flag[i] = 0
    while 1:
        p += 1
        if flag[p] == 1:
            break

m = int(input())
id_list = []
for i in range(m):
    my_id = input()
    if my_id in winners_list:
        if my_id in id_list:
            print('{}: Checked'.format(my_id))
        else:
            id_list.append(my_id)
            winner_index = winners_list.index(my_id) + 1
            if winner_index == 1:
                print('{}: Mystery Award'.format(my_id))
            elif winner_index == 2 or winner_index in prime:
                print('{}: Minion'.format(my_id))
            else:
                print('{}: Chocolate'.format(my_id))
    else:
        print('{}: Are you kidding?'.format(my_id))

新代码:

n = int(input())
winners_dict = dict()
for i in range(n):
    winners_dict[input()] = i + 1

prime = set()
if n < 10:
    n = 10
flag = [1] * (n + 2)
p = 2
while p <= n:
    prime.add(p)
    for i in range(2 * p, n + 1, p):
        flag[i] = 0
    while 1:
        p += 1
        if flag[p] == 1:
            break

m = int(input())
for i in range(m):
    my_id = input()
    if my_id in winners_dict.keys():
        x = winners_dict[my_id]
        winners_dict[my_id] = -1
        if x == -1:
            print('{}: Checked'.format(my_id))
        elif x == 1:
            print('{}: Mystery Award'.format(my_id))
        elif x in prime:
            print('{}: Minion'.format(my_id))
        else:
            print('{}: Chocolate'.format(my_id))
    else:
        print('{}: Are you kidding?'.format(my_id))

你可能感兴趣的:(PAT,Python)