zoukankan      html  css  js  c++  java
  • B1059 C语言竞赛

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

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

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

    输入格式:

    输入第一行给出一个正整数 N(≤),是参赛者人数。随后 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?

    最终AC代码如下:
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    const int N = 10005;
    bool hashTable[N]={false};
    
    struct Mystr{
        int no;
        string s;
        Mystr(){
            no = 0;
            s = "";
        }
    };
    
    void Find_Prime(int n){
        for(int i=2; i<=n; i++){
            for(int j=i+i; j<=n; j+=i){
                hashTable[j] = true;
            }
        }
    }
    
    int main(){
        int i, j, n, k, temp;
        int record[N]={0}; 
        vector<Mystr> vms;
        Mystr t;
        string s;
        scanf("%d", &n);
        Find_Prime(n);
        for(i=1; i<=n; i++){
            cin>>s;
            temp = 0;
            for(j=0; j<4; j++){
                temp = temp * 10 + s[j] - '0';
            }
            record[temp] = 1;
            t.no = temp;
            if(i==1){
                t.s = ": Mystery Award";
            }else if(hashTable[i]){
                t.s = ": Chocolate";
            }else{
                t.s = ": Minion";
            }
            vms.push_back(t);
        }
        scanf("%d", &k);
        while(k--){
            cin>>s;
            temp = 0;
            for(j=0; j<4; j++){
                temp = temp * 10 + s[j] - '0';
            }
            if(record[temp]==1){
                for(j=0; j<vms.size(); j++){
                    if(vms[j].no==temp){
                        cout<<s<<vms[j].s<<endl;
                    }
                }
                record[temp]++;
            }else if(record[temp]==2){
                cout<<s<<": Checked"<<endl;
            }else{
                cout<<s<<": Are you kidding?"<<endl;
            }
        }
        return 0;
    }

    提示:采用记录输入数据,查询时逐一比较的方法,容易出现超时现象。(主要是测试用例1、2不能通过)

    主要思路是:
    1.找出[1, n]中的素数。
    2.在输入数据时,进行奖项的判断。
    3.由于编号只占4位,可以考虑用数组下标标记的方式。
    4.由于查询时已输入编号,再次查询的情况要单独考虑,因此标记数组考虑为int型。

  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/heyour/p/12237625.html
Copyright © 2011-2022 走看看