PAT-2019年秋季考试-甲级

こ雲淡風輕ζ 提交于 2021-02-14 23:20:49

7-1 Forever (20 分)

#include <bits/stdc++.h>
using namespace std;
int N,K,m,number[10];
multimap<int,int> mp;
int sum_digit(int num) {
	int sum=0;
	while(num/10) {
		sum+=num%10;
		num/=10;
	}
	sum+=num;
	return sum;
}
int gcd(int a, int b) {
	if(a%b==0) {
		return b;
	} else return gcd(b,a%b);
}
bool isprime(int num) {
	if(num<=2) return false;
	int temp=sqrt(num);
	for(int i=2;i<=temp;++i) {
		if(!(num%temp)) return false;
	}
	return true;
}
void dfs(int index, int sum) {
	if(index==0) {
		if(sum==0) {
			int A=0;
			for(int i=K-1;i>=1;--i) {
				A=A*10+number[i];
			}
			A=(A*10+9);
			int n=sum_digit(A+1);
			int gcdnum=gcd(n,m);
			if(isprime(gcdnum)) {
				mp.insert(make_pair(n,A));
			}
		}
		return;
	}
	if(index==K-1) {
		for(int i=1;i<=9;++i) {
			if(sum-i>=0) {
				number[index]=i;
				dfs(index-1,sum-i);
			} else return;
		}
		return;
	}
	for(int i=0;i<=9;++i) {
		if(sum-i>=0) {
			number[index]=i;
			dfs(index-1,sum-i);
		} else return;
	}
	return;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen("in.txt","r",stdin);
	cin>>N;
	for(int i=1;i<=N;++i) {
		mp.clear();
		cin>>K>>m;
		dfs(K-1,m-9);
		cout<<"Case "<<i<<endl;
		if(mp.size()==0) {
			cout<<"No Solution"<<endl;
		} else {
			for(auto it=mp.begin();it!=mp.end();it++) {
				cout<<it->first<<" "<<it->second<<endl;
			}
		}
	}
	return 0;
}

7-2 Merging Linked Lists (25 分)

#include <bits/stdc++.h>
using namespace std;
struct node {
	int add,data,next;
};
unordered_map<int,node> mp;
vector<node> a,b,c;
void merge(vector<node> l1, vector<node> l2) {
	int lena=l1.size(),lenb=l2.size(),index=0,indexa=0,indexb=0;
	while(indexa<lena||indexb<lenb) {
		if(indexa<lena) {
			c.push_back(l1[indexa]);
			indexa++;
		}
		if(indexa<lena) {
			c.push_back(l1[indexa]);
			indexa++;
		}
		if(indexb<lenb) {
			c.push_back(l2[lenb-1-indexb]);
			indexb++;
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int addl1,addl2,n;
	cin>>addl1>>addl2>>n;

	int add,data,next;
	node temp;
	for(int i=0; i<n; ++i) {
		cin>>add>>data>>next;
		temp.add=add;
		temp.data=data;
		temp.next=next;
		mp.insert(make_pair(add,temp));
	}
	add=addl1;
	while(add!=-1) {
		temp=mp.find(add)->second;
		a.push_back(temp);
		add=temp.next;
	}
	add=addl2;
	while(add!=-1) {
		temp=mp.find(add)->second;
		b.push_back(temp);
		add=temp.next;
	}
	int lena=a.size(),lenb=b.size();
	if(lena>lenb) merge(a,b);
	else merge(b,a);

	int lenc=c.size();
	for(int i=0; i<lenc-1; ++i) printf("%05d %d %05d\n",c[i].add,c[i].data,c[i+1].add);
	printf("%05d %d -1\n",c[lenc-1].add,c[lenc-1].data);
	return 0;
}

7-3 Postfix Expression (25 分)

#include <bits/stdc++.h>
using namespace std;
struct node {
	string data;
	int pre,l,r;
};
node ans[25];
void dfs(int root) {
	cout<<"(";
	if(ans[root].l!=-1&&ans[root].r!=-1) {
		dfs(ans[root].l);
		dfs(ans[root].r);
		cout<<ans[root].data;
	} else if(ans[root].l==-1&&ans[root].r==-1) {
		cout<<ans[root].data;
	} else if(ans[root].l==-1&&ans[root].r!=-1) {
		cout<<ans[root].data;
		dfs(ans[root].r);
	}
	cout<<")";
	return;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen("in.txt","r",stdin);
	int N;
	cin>>N;
	for(int i=1;i<=N;++i) {
		cin>>ans[i].data>>ans[i].l>>ans[i].r;
		ans[i].pre=i;
	}
	for(int i=1;i<=N;++i) {
		if(ans[i].l!=-1) ans[ans[i].l].pre=i;
		if(ans[i].r!=-1) ans[ans[i].r].pre=i;
	}
	int root;
	for(int i=1;i<=N;++i) {
		if(ans[i].pre==i) {
			root=i;
			break;
		}
	}
	dfs(root);
	return 0;
}

7-4 Dijkstra Sequence (30 分)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
const int maxm = 1e5+5;
int g[maxn][maxn],ans[maxn],dis[maxn];
bool vis[maxn];
bool dij(int s, int n) {
	fill(dis,dis+maxn,INT_MAX); 
	dis[s]=0;
	fill(vis,vis+maxn,false);
	for(int i=1;i<=n;++i) {
		int v=-1,temp=INT_MAX;
		for(int u=1;u<=n;++u) {
			if(dis[u]<temp&&vis[u]==false) {
				temp=dis[u];
				v=u;
			}	
		}
		if(v==-1) return false;
		if(dis[ans[i]]!=dis[v]||vis[ans[i]]==true) return false;
		v=ans[i];
		vis[v]=true;
		for(int u=1;u<=n;++u) {
			if((g[v][u]!=INT_MAX)&&(vis[u]==false)&&(dis[v]+g[v][u]<dis[u])) {
				dis[u]=dis[v]+g[v][u];
			}
		}
	}
	return true;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen("in.txt","r",stdin);
	
	int nv,ne,k;
	cin>>nv>>ne;
	int u,v,w;
	fill(g[0],g[0]+maxn*maxn,INT_MAX);
	for(int i=1;i<=ne;++i) {
		cin>>u>>v>>w;
		g[u][v]=g[v][u]=w;
	}
	cin>>k;
	while(k--) {
		for(int i=1;i<=nv;++i) {
			cin>>ans[i];	
		}
		if(dij(ans[1],nv)==true) {
			cout<<"Yes"<<endl;
		} else {
			cout<<"No"<<endl;
		}
	}
	return 0;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!