PAT(甲级)2018年冬季考试
Posted fisherss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2018年冬季考试相关的知识,希望对你有一定的参考价值。
1152 Google Recruitment
思路:判断素数
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int a[maxn];
int n,k;
long long getNum(int pos)
long long x = 0;
for(int i=pos;i<=pos+k-1;i++)
x = x*10 + a[i];
return x;
bool prime(long long x)
if(x < 2) return false;
if(x == 2) return true;
int endss = sqrt(x);
for(int i=2;i<=endss;i++)
if(x%i == 0) return false;
return true;
void print(long long x)
int len = 0;
long long temp = x;
while(temp)
temp/=10;
len++;
if(len == k)
printf("%lld",x);
return;
int t = k - len;
while(t--)printf("0");
printf("%lld",x);
int main()
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%1d",&a[i]);
bool flag = false;
for(int i=1;i+k-1<=n;i++)
long long x = getNum(i);
if(prime(x))
flag = true;
print(x);
break;
if(flag == false) puts("404");
return 0;
1153 Decode Registration Card of PAT
思路:结构体排序,map计数,string.c_str()把字符串转成字符数组后可以使用print输出
注意:使用太多cin、cout太慢了会超时
#include<bits/stdc++.h>
//#include<unordered_map>
using namespace std;
/*
Cin和Cout不能用太多啦
除了string 和 char类型的输入 最好把Cin替换成scanf
Cout全部换成printf 对于string类型的printf 需要将string转换成字符数组
string.c_str();
*/
const int maxn = 1e4+10;
int n,m;
struct node
char type;
int site;
string date;
int num;
int score;
string all;
;
struct node stu[maxn];
vector<node> ans;
bool cmp1(node s1,node s2)
if(s1.score == s2.score)
s1.all < s2.all;
return s1.score > s2.score;
bool cmp2(node s1,node s2)
if(s1.score > s2.score) return true;
else if(s1.score < s2.score) return false;
return s1.all < s2.all;
int mm[1001];
struct nod
int site;
int num;
nod(int sss,int nnn)
site = sss;
num = nnn;
;
vector<nod> ans3;
bool cmp3(nod s1,nod s2)
if(s1.num == s2.num) return s1.site < s2.site;
return s1.num > s2.num;
int main()
// cin>>n>>m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
string str;
int score;
// cin>>str>>score;
cin>>str;
// scanf("%s",&str);
scanf("%d",&score);
stu[i].all = str;
stu[i].score = score;
stu[i].type = str[0];
stu[i].site = (str[1] - '0') * 100 + (str[2] - '0') * 10 + (str[3] - '0');
stu[i].date = str.substr(4,6);
stu[i].num = (str[10] - '0') * 100 + (str[11] - '0') * 10 + (str[12] - '0');
for(int Case=1;Case<=m;Case++)
int Type;
// cin>>Type;
scanf("%d",&Type);
int cnt = 0;
ans.clear();
ans3.clear();
if(Type == 1)
char type;
cin>>type;
printf("Case %d: 1 %c\n",Case,type);
for(int i=1;i<=n;i++)
if(stu[i].type == type)
ans.push_back(stu[i]);
cnt = ans.size();
if(cnt == 0)
puts("NA");
else
sort(ans.begin(),ans.end(),cmp2);
for(int i=0;i<=cnt-1;i++)
// cout<<ans[i].all<<" "<<ans[i].score<<endl;
printf("%s ",ans[i].all.c_str());
printf("%d\n",ans[i].score);
else if(Type == 2)
int site;
// cin>>site;
scanf("%d",&site);
printf("Case %d: 2 %d\n",Case,site);
int tot = 0;
for(int i=1;i<=n;i++)
if(stu[i].site == site)
tot += stu[i].score;
cnt++;
if(cnt == 0)
puts("NA");
else
printf("%d %d\n",cnt,tot);
else if(Type == 3)
string date;
cin>>date;
printf("Case %d: 3 ",Case);
// cout<<date<<endl;
printf("%s\n",date.c_str());
for(int i=100;i<=999;i++) mm[i] = 0;
for(int i=1;i<=n;i++)
if(stu[i].date == date)
mm[stu[i].site]++;
for(int i=100;i<=999;i++)
if(mm[i] != 0)
ans3.push_back(nod(i,mm[i]));
// map<int, int> mp;
// for(int i=1;i<=n;i++)
// if(stu[i].date == date) mp[stu[i].site]++;
//
// map<int, int>::iterator it = mp.begin();
// while(it!=mp.end())
// ans3.push_back(nod(it->first,it->second));
// it++;
// cnt++;
//
cnt = ans3.size();
if(cnt == 0)
puts("NA");
else
sort(ans3.begin(),ans3.end(),cmp3);
for(int i=0;i<=cnt-1;i++)
// cout<<ans3[i].site<<" "<<ans3[i].num<<endl;
printf("%d %d\n",ans3[i].site,ans3[i].num);
return 0;
1154 Vertex Coloring
思路:图论,dfs遍历检查相邻结点的颜色
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int n,m,k;
vector<int> g[maxn];
int col[maxn];
int vis[maxn];
set<int> se;
bool flag = false;
void dfs(int x)
if(flag == false) return;
vis[x] = 1;
for(int i=0;i<g[x].size();i++)
int v = g[x][i];
if(col[x] == col[v]) flag = false;
if(!vis[v]) dfs(v);
int main()
cin>>n>>m;
for(int i=1;i<=m;i++)
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
cin>>k;
while(k--)
se.clear();
for(int i=0;i<n;i++)
cin>>col[i];
se.insert(col[i]);
vis[i] = 0;
flag = true;
for(int i=0;i<n;i++)
if(flag == false) break;
if(vis[i]) continue;
dfs(i);
if(flag) cout<<se.size()<<"-coloring"<<endl;
else cout<<"No"<<endl;
return 0;
1155 Heap Paths
思路:给定序列,判断是否大根堆、小根堆(特殊二叉树)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50010;
int n;
int g[maxn];
vector<int> v;
bool flagMin = false;
bool flagMax = false;
bool flag = true;
void dfs(int x)
v.push_back(g[x]);
if(x * 2 + 1 <= n)
dfs(x * 2 + 1);
if(x * 2 <= n)
dfs(x * 2);
if(x * 2 + 1 > n && x * 2 > n)
int temp = v[0];
if(flag)
int cnt = 0;
for(int i=0;i<v.size();i++)
if(i > 0 && v[i] >= v[i-1]) cnt++;
if(cnt == v.size() - 1) flagMax = true;
else if(cnt == 0) flagMin = true;
else flag = false;
for(int i=0;i<v.size();i++)
if(i == 0) cout<<v[i];
else cout<<" "<<v[i];
if(v.size() != 0) cout<<endl;
v.erase(v.end()-1);
int main()
cin>>n;
for(int i=1;i<=n;i++) cin>>g[i];
dfs(1);
if(flag == false)
cout<<"Not Heap"<<endl;
else if(flagMin == true && flagMax == false)
cout<<"Max Heap"<<endl;
else if(flagMin == false && flagMax == true)
cout<<"Min Heap"<<endl;
else
cout<<"Not Heap"<<endl;
return 0;
以上是关于PAT(甲级)2018年冬季考试的主要内容,如果未能解决你的问题,请参考以下文章
PAT(甲级)2018年冬季考试 7-1 Google Recruitment
PAT(甲级)2018年冬季考试 7-3 Vertex Coloring