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;
}