PTA 乙级 1059 C语言竞赛 (20分)

 

 看见时间限制200ms,必然有猫腻(运行超时)

如果查询的时候用遍历的方法一个个对应,必然会超时

所以,建立一个足够大的数组,ID对应数组角标,存储ID的排名(二维数组第一位[0])和确定是否被检查过(二维数组第二位[1])(int id[10001][2])

判断是否为素数,用平方根的方法判断,缩短运算速度(1013数素数

1 bool isPrime(int num) {
2     for (int i = 2; i <= sqrt(num); ++i) {
3         if (num % i == 0) {
4             return 0;
5         }
6     }
7     return 1;
8 }

二维数组[0]存储名次,[1]存储是否被检查的标志位

 1 #include<iostream>
 2 #include<vector>
 3 #include<cmath>
 4 
 5 using namespace std;
 6 
 7 int id[10001][2] = { 0 };
 8 
 9 bool isPrime(int num) {                        //判断是否为素数
10     for (int i = 2; i <= sqrt(num); ++i) 
11         if (num % i == 0) return 0;
12     return 1;
13 }
14 
15 int main() {
16     int n = 0, k = 0;
17     cin >> n;
18     for (int i = 0; i < n; ++i) {
19         int tmp = 0;
20         cin >> tmp;                            
21         id[tmp][0] = i + 1;                            //对应id存储对应名次
22     }
23     cin >> k;
24     for (int i = 0; i < k; ++i) {
25         int fid = 0;
26         cin >> fid;
27         printf("%04d: ", fid);                        //保证四位,空位补零
28         if (id[fid][0] == 0)                        //没有对应名次
29             cout << "Are you kidding?" << endl;
30         else if (id[fid][1] == 0) {                    //未被检查过
31             if (id[fid][0] == 1) cout << "Mystery Award" << endl;
32             else if (isPrime(id[fid][0])) cout << "Minion" << endl;
33             else cout << "Chocolate" << endl;
34             id[fid][1] = 1;                            //确认是否被检查的标志位置1
35         }
36         else
37             cout << "Checked" << endl;
38         
39     }
40     return 0;
41 }

 

posted @ 2020-08-28 00:02  上帝的绵羊  阅读(220)  评论(0编辑  收藏  举报