PAT(Basic Level) Practice : 1059 C语言竞赛 (20分)

1059 C语言竞赛 (20分)

参考:https://www.cnblogs.com/exciting/p/10347425.html
参考:https://www.codenong.com/cs105912348/

测试点1,2超时:哈希表

必须使用哈希表,否则超时
以数组下标作为查询的ID,数组内储存奖品。

for(int i=0;i<num2;i++)
    {
        int query;
        scanf("%d",&query);
        printf("%04d: %s\n",query,a[Hash[query]]);
        if(Hash[query])
            Hash[query]=4;
    }

这一段代码也很有意思
查询过一次存在的ID后,把哈希表对应的值改成4,表示已经查询过一次。

代码

#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;

#include<iomanip>
//精度

#include<cmath>
//round四舍五入取整

//哈希映射
const int maxn=10010;
int Hash[maxn]={0};
char a[5][20]={"Are you kidding?","Mystery Award","Minion","Chocolate","Checked"};

bool judge(int num)
{

    int stop=sqrt(num);
    if(num==2)
        return true;
    if(num%2==0)
        return false;
    for(int i=3;i<=stop;i+=2)
    {
        if(num%i==0)
            return false;
    }
    return true;


}

int main()
{
    int num1,num2;
    scanf("%d",&num1);
    for(int i=1;i<=num1;i++)
    {
        int ID;
        scanf("%d",&ID);
        if(i==1)
        {
            Hash[ID]=1;
        }else if(judge(i))
        {
            Hash[ID]=2;
        }else
        {
            Hash[ID]=3;
        }
    }

    scanf("%d",&num2);
    for(int i=0;i<num2;i++)
    {
        int query;
        scanf("%d",&query);
        printf("%04d: %s\n",query,a[Hash[query]]);
        if(Hash[query])
            Hash[query]=4;
    }
    return 0;
}

posted @ 2020-09-27 22:40  韩天尊  阅读(199)  评论(0)    收藏  举报