PAT-2018年冬季考试-甲级

在这里插入图片描述
感觉不错,全部1A,虽然第二题打得有点久,似乎其他题都是十分钟1A的- =

第一题:判断素数

#include<cstdio> 
using namespace std;

typedef long long ll;

const int N=10000+5;

char ss[N];

int check(ll x)
{
	for(int i=2;1LL*i*i<=x;i++)
		if(x%i==0)
			return 0;
	return 1;
}

int main()
{
	int n,k;
	scanf("%d%d",&n,&k);
	scanf("%s",ss);
	bool flag=0;
	for(int i=0;i<=n-k;i++)
	{
		ll sum=0;
		for(int j=i;j<i+k;j++)
			sum=sum*10+ss[j]-'0';
		if(check(sum))
		{
			flag=1;
			for(int j=i;j<i+k;j++)
				printf("%c",ss[j]);
			puts("");
			break;
		}
	}
	if(!flag) puts("404");
	return 0;
}

第二题:STL统计

#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<map>
#include<string> 
using namespace std;

const int N=1e4+5;

struct Q1
{
	char card[20];
	int score;
	bool operator<(const Q1& q)const
	{
		if(score!=q.score) return score>q.score;
		return strcmp(card,q.card)<0;	
	}
};

struct Q2
{
	int site,num;
	bool operator<(const Q2&q)const
	{
		if(num!=q.num) return num>q.num;
		return site<q.site;
	}
}q2[N];

set<Q1> st[10];	
int st2[N][2];
vector<int> st3[N];
set<Q2> outp;
map<int,int> outp1;
map<string,int> mp;

int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		int score;
		char card[30];
		scanf("%s%d",card,&score);
		char level;
		int sitenum=0;
		int num=0;
		
		level=card[0];
		
		for(int j=1;j<4;j++)
			sitenum=sitenum*10+card[j]-'0';
			
		char date[20];
		int len=0;
		for(int j=4;j<10;j++)
			date[len++]=card[j];
		date[len]='\0';
		
		for(int j=10;j<13;j++)
			num=num*10+card[j]-'0';
			
		Q1 q;
		q.score=score;strcpy(q.card,card);
		
		if(level=='T') st[0].insert(q);
		else if(level=='A') st[1].insert(q); 
		else st[2].insert(q); 
		
		st2[sitenum][0]+=1,st2[sitenum][1]+=score;
		
		if(!mp.count(date)) mp[date]=++cnt;
		st3[mp[date]].push_back(sitenum);
	}
	int cas=1;
	while(m--)
	{
		int op;
		char pp[20];
		scanf("%d%s",&op,pp);
		printf("Case %d: %d %s\n",cas++,op,pp);
		if(op==1)
		{
			if(pp[0]=='T')
			{
				if(st[0].size()==0)
					puts("NA");
				else 
				{
					for(set<Q1>::iterator it=st[0].begin();it!=st[0].end();it++)
						printf("%s %d\n",it->card,it->score);
				}
			}
			else if(pp[0]=='A')
			{
				if(st[1].size()==0)
					puts("NA");
				else 
				{
					for(set<Q1>::iterator it=st[1].begin();it!=st[1].end();it++)
						printf("%s %d\n",it->card,it->score);
				}
			}
			else
			{
				if(st[2].size()==0)
					puts("NA");
				else 
				{
					for(set<Q1>::iterator it=st[2].begin();it!=st[2].end();it++)
						printf("%s %d\n",it->card,it->score);
				}
			}
		}
		else if(op==2)
		{
			int sitenum;
			sscanf(pp,"%d",&sitenum);
			if(st2[sitenum][0]==0)
				puts("NA");
			else 
				printf("%d %d\n",st2[sitenum][0],st2[sitenum][1]);
		}
		else
		{
			outp.clear();
			outp1.clear();
			if(!mp.count(pp)||st3[mp[pp]].size()==0) 
				puts("NA");
			else
			{
				for(int i=0;i<st3[mp[pp]].size();i++)
				{
					int v=st3[mp[pp]][i];
					outp1[v]++;
				}
				for(map<int,int>::iterator it=outp1.begin();it!=outp1.end();it++)
				{
					Q2 q;
					q.site=it->first,q.num=it->second;
					outp.insert(q);
				} 
				for(set<Q2>::iterator it=outp.begin();it!=outp.end();it++)
					printf("%03d %d\n",it->site,it->num);
			}
		}
	}
	return 0; 
} 

第三题:暴力判断

#include<cstdio>
#include<vector>
#include<set>
using namespace std;

const int N=1e4+5;

int n,m,a[N];
vector<int> G[N];
set<int> st;

int check()
{
	for(int i=0;i<n;i++)
		for(int j=0;j<G[i].size();j++)
			if(a[i]==a[G[i][j]])
				return 0;
	return 1;
}

int main()
{
	scanf("%d%d",&n,&m);
	while(m--)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	int q;scanf("%d",&q);
	while(q--)
	{
		st.clear();
		for(int i=0;i<n;i++)
		{
			scanf("%d",a+i);
			st.insert(a[i]);
		}	
		if(check()) printf("%d-coloring\n",st.size());
		else puts("No");
	}
	return 0;
}

第四题:堆(原题)

#include<cstdio>
#include<vector>
using namespace std;

const int N=1000+5;

vector<int> now;
vector< vector<int> > res;
int flag1,flag2,n,a[N];

void dfs1(int u)//xiao
{
	now.push_back(a[u]);
	int ls=u<<1,rs=u<<1|1,s=0;
	if(rs<=n)
	{
		dfs1(rs),s++;
		if(a[rs]<=a[u]) flag1=0;
	} 
	if(ls<=n)
	{
		dfs1(ls),s++;
		if(a[ls]<=a[u]) flag1=0;
	} 
	if(s==0) res.push_back(now);
	now.pop_back();
}

void dfs2(int u)//da
{
	int ls=u<<1,rs=u<<1|1;
	if(rs<=n)
	{
		dfs2(rs);
		if(a[rs]>=a[u]) flag2=0;
	} 
	if(ls<=n)
	{
		dfs2(ls);
		if(a[ls]>=a[u]) flag2=0;
	}
}

int main()
{
	flag1=flag2=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",a+i);
	dfs1(1);	
	dfs2(1);
	for(int i=0;i<res.size();i++)
		for(int j=0;j<res[i].size();j++)
			printf("%d%c",res[i][j]," \n"[j+1==res[i].size()]);
	if(flag1) puts("Min Heap");
	else if(flag2) puts("Max Heap");
	else puts("Not Heap");
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值