zoukankan      html  css  js  c++  java
  • 1059 C语言竞赛 (ID映射编号映射字符串)

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

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

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

    输入格式:

    输入第一行给出一个正整数 N(≤10e+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?
    

    看着N=10^4的大小想尝试用O(N^2)的暴力解法:

    #include<cstdio>
    #include<cstring>
    const int max=10010;
    int prime[max],num=0;
    bool pp[max]={0};
    
    struct person{
        char *prize;
        int check=0;
        char id[5];
    }p[10010];
    
    void init(int n){
        for(int i=2;;i++){
            if(!pp[i]){
                prime[num++]=i;
                if(num>=n) break;
                for(int j=i+i;j<max;j+=i){
                    pp[j]=1;
                }
            }
        }
    }
    
    int main(){
        int n,nn,j;
        scanf("%d",&n);
        getchar();
        init(n);
        for(int i=1;i<=n;i++){
            scanf("%s",&p[i].id);
            if(i==1) p[i].prize="Mystery Award";
            else if(pp[i]) p[i].prize="Chocolate";
            else p[i].prize="Minion";
        }
        char temp[5];
        scanf("%d",&nn);
        for(int i=1;i<=nn;i++){
            scanf("%s",temp);
            printf("%s: ",temp);
            for(j=1;j<=n;j++){
                if(strcmp(temp,p[j].id)==0){
                    if(p[j].check==0){
                        p[j].check=1;
                        printf("%s
    ",p[j].prize);
                    }else{
                        printf("Checked
    ");
                    }
                    break;
                }
            }
            if(j==n+1)printf("Are you kidding?
    ");
        }
        return 0;
    }
    提交时间状态分数题目编译器耗时用户
    2019/2/2 00:49:37
    部分正确
    14 1059 C++ (g++) 3 ms Argentina_WU LEI
    测试点结果耗时内存
    0 答案正确 3 ms 512 KB
    1 运行超时 0 ms 0 KB
    2 运行超时 0 ms 0 KB
    3 答案正确 3 ms 512 KB

    只得了14/20分,所以此类题还是不能抱有侥幸,需要哈希映射的思路:

    #include<cstdio>
    const int maxn=10010;
    int I[maxn]={0};//chushihuawei0
    char a[5][20]={"Are you kidding?","Mystery Award","Minion","Chocolate","Checked"};
    
    bool isPrime(int x){
        if(x<=1) return false;
        for(int i=2;i*i<=x;i++)
            if(x%i==0) return false;
        return true;
    }
    
    int main(){
        int n,ID;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&ID);
            if(i==1) I[ID]=1;
            else if(isPrime(i)) I[ID]=2;
            else I[ID]=3;
        }
        int m,query;
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%d",&query);
            printf("%04d: %s
    ",query,a[I[query]]);
            if(I[query]) I[query]=4;
        }
        return 0;
    }

    书中给出的上述代码既简短,思路也很好(默认为“Are you kidding?”)

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/exciting/p/10347425.html
Copyright © 2011-2022 走看看