zoukankan      html  css  js  c++  java
  • 1059 C语言竞赛 (20分)

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

    0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
    1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
    2、其他人将得到巧克力。
    给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。

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

    这个题目用散列来做非常简单,但用查找法也能写,如果超时可能是查找没处理好,用二分法可以降低复杂度。

    二分查找法来写,自己对查找又加强了了解。

    #include <iostream>
    #include<string>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    struct node{
            int rank;
            string id;
            bool getgift = false;
        }stu[10010];
    bool cmp(node a, node b) {
            return a.id < b.id;//按字典序排序
    }
    bool isp(int a) {//验证是否为质数
        int n = sqrt(a)+1;
        for (int i = 2; i <= n; i++)
            if (a % i == 0)
                return false;
        return true;
    }
    int find(node* p, string a,int n) {//二分查找
        int sta = 0, last = n-1;    
        while (sta <= last) {
            if ((p + (sta + last) / 2)->id == a)
                return (sta + last) / 2;
            if ((p + (sta + last) / 2)->id > a)
                last = (sta + last) / 2 - 1;
            else
                sta = (sta + last) / 2 + 1;            
        }
        if ((p + n - 1)->id == a)return n - 1;//不知道为啥查不到末尾,只好手动添加末尾验证。
        return -1;
    }
    int main() {    
        int num, want_num;
        string want_find;
        cin >> num;
        for (int i = 0; i < num; ++i) {
            cin >> stu[i].id;
            stu[i].rank = i + 1;
        }
        sort(stu, stu+num-1,cmp);//先排个序,这样好查找。
        cin >> want_num;
        for (int i = 0; i < want_num; ++i) {
            cin >> want_find;
            bool ha = false;
            int j = find(stu, want_find, num);//返回下标
            if (j >= 0)//找到了该id
            {
                if (stu[j].getgift == false) {//礼物没有领取。
                    if (stu[j].rank == 1)
                        cout << stu[j].id << ": " << "Mystery Award" << endl;
                    else if (isp(stu[j].rank))
                        cout << stu[j].id << ": " << "Minion" << endl;
                    else
                        cout << stu[j].id << ": " << "Chocolate" << endl;
                    stu[j].getgift = true;
                }
                else
                    cout << stu[j].id << ": " << "Checked" << endl;
            }
            else//未找到该id
                cout << want_find << ": " << "Are you kidding?" << endl;
            
        }
        return 0;
    }

    用散列来写的代码,空间换时间策略。(很简单,不是吗?)

    #include <iostream>
    #include<math.h>
    using namespace std;
    bool isp(int a) {
        int n = sqrt(a)+1;
        for (int i = 2; i <= n; i++)
            if (a % i == 0)
                return false;
        return true;
    }
    int main() {
        int all[10010][2] = { 0 };//第一个数值记录排名,没有id则排名为0,第二个数值记录是否领取礼物;
        int num, want_num;
        int want_find;
        cin >> num;
        for (int i = 0; i < num; ++i) {
            int a;
            cin >> a;
            all[a][0] = i+1;//记录排名
        }
        cin >> want_num;
        for (int i = 0; i < want_num; ++i) {
            cin >> want_find;
            if (all[want_find][0] > 0) 
            {
                if (all[want_find][1]==0) {
                    if (all[want_find][0] == 1) {
                        printf("%04d", want_find);
                        cout << ": " << "Mystery Award" << endl;
                    }
                    else if (isp(all[want_find][0])) {
                        printf("%04d", want_find);
                        cout <<": " << "Minion" << endl;
                    }
                    else {
                        printf("%04d",want_find);
                        cout << ": " << "Chocolate" << endl;
                    }
                    all[want_find][1] = 1;//表示已经领取礼物
                }
                else {
                    printf("%04d", want_find);
                    cout << ": " << "Checked" << endl;
                }
            }
            else {
                printf("%04d", want_find);
                cout << ": " << "Are you kidding?" << endl;
            }      
        }
        return 0;
    }
  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/kalicener/p/12531441.html
Copyright © 2011-2022 走看看