PAT(甲级)2019年秋季考试


第一题用搜索,超时了,待补
##7-1搜索 12/20分

#include<bits/stdc++.h>
using namespace std;

int n,k,m;
typedef long long ll;
ll starts = 0;
ll endss = 0;
bool flag = false;
bool first = true;
int t = 1;

int sums(ll x){
	int ans = 0;
	while(x){
		ans += x%10;
		x/=10;
	}
	return ans;
}

ll gcd(ll a,ll b){
	if(b == 0) return a;
	return gcd(b,a%b);
}

bool solve(ll x){
	if(x <= 2) return false;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i == 0) return false;
	}
	return true;
}

void dfs(int step,ll x){
	if(x >= endss) return;
	if(step > k+1) return;
	if(sums(x) > m) return;
	if(step == k+1) {
		int t1 = sums(x);
		if(sums(x) != m) return;
		int t2 = sums(x+1);
		ll g = gcd(t1,t2);
		if(solve(g)){
			if(first){
				first = false;
				cout<<"Case "<<t<<endl;
			}
			flag = true;
			cout<<t2<<" "<<x<<endl;
		}
		return;
	}
	for(int i=0;i<=9;i++){
		if(i==0 && step == 1) continue;
		ll temp = x * 10 + i;
		dfs(step+1,temp);
	}
} 

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>k>>m;
		starts = pow(10,k-1);
		endss = pow(10,k);
		flag = false;
		first = true;
		t = i;
		dfs(1,0);
		if(flag == false){
			cout<<"Case "<<t<<endl;
			cout<<"No Solution"<<endl;
		}
	}
	return 0;
}

##7-2链表模拟 25

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5+10;

struct node{
	int  address;
	int data;
	int  next;
}li[maxn];

int s1,s2;
int n; //不一定都是有效结点
vector<node> v1;
vector<node> v2;
vector<node> ans;

int main(){
	scanf("%d%d%d",&s1,&s2,&n);
	for(int i=1;i<=n;i++){
		int dat,add,nex;
		scanf("%d%d%d",&add,&dat,&nex);
		li[add].address = add;
		li[add].data = dat;
		li[add].next = nex;
	}
	for(int cur = s1;cur != -1;cur = li[cur].next) v1.push_back(li[cur]);
	for(int cur = s2;cur != -1;cur = li[cur].next) v2.push_back(li[cur]);
	int len1 = v1.size() - 1;
	int len2 = v2.size() - 1;
	if(len1 >= 2*len2){
		reverse(v2.begin(),v2.end());
		int idx2 = 0;
		int idx1 = 0;
		while(idx2 <= len2){
			ans.push_back(v1[idx1++]);
			ans.push_back(v1[idx1++]);
			ans.push_back(v2[idx2++]);
		}
		while(idx1 <= len1) ans.push_back(v1[idx1++]);
	}else{
		reverse(v1.begin(),v1.end());
		int idx2 = 0;
		int idx1 = 0;
		while(idx1 <= len1){
			ans.push_back(v2[idx2++]);
			ans.push_back(v2[idx2++]);
			ans.push_back(v1[idx1++]);
		}
		while(idx2 <= len2) ans.push_back(v2[idx2++]);
	}
	n = ans.size();
	for(int i=0;i<n-1;i++){
		printf("%05d %d %05d\n",ans[i].address,ans[i].data,ans[i+1].address);
	}
	printf("%05d %d -1\n",ans[n-1].address,ans[n-1].data);
	return 0;
}

##7-3树 25

#include<bits/stdc++.h>
using namespace std;

struct node{
	string dat;
	int lc,rc;
}tree[25];

int n;
int vis[25];

void dfs(int x){
	if(x > n) return;
	cout<<"(";
	if(tree[x].lc == -1 &&  tree[x].rc != -1){
		cout<<tree[x].dat;
		dfs(tree[x].rc);
		cout<<")";
	}else{
		if(tree[x].lc!=-1) dfs(tree[x].lc);
		if(tree[x].rc!=-1) dfs(tree[x].rc);
		cout<<tree[x].dat;
		cout<<")";
	}
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>tree[i].dat>>tree[i].lc>>tree[i].rc;
		if(tree[i].lc != -1) vis[tree[i].lc] = 1;
		if(tree[i].rc != -1) vis[tree[i].rc] = 1;
	}
	int root = 1;
	for(int i=1;i<=n;i++){ //先确定 根的结点 没有当过
		if(!vis[i]) root = i;
	}
	dfs(root);
	return 0;
}

##7-4最短路 30

#include<bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
const int maxn = 1e3+10;
const int maxm = 1e5+10;
struct edge{
	int v;
	int w;
	edge(int vv,int ww){
		v = vv;
		w = ww;
	}
};

vector<edge> g[maxn];
int n,e,k;
int di[maxn];
int dist[maxn];
int vis[maxn];

bool dijkstra(int s){
	memset(dist,inf,sizeof(dist));
	memset(vis,0,sizeof(vis));
	dist[s] = 0;
	for(int i=1;i<=n;i++){
		int v,min_w = inf;
		for(int j=1;j<=n;j++){
			if(!vis[j] && dist[j] < min_w){
				v = j;
				min_w = dist[j];
			}
		}
		if(min_w == inf) return false;
		vis[v] = 1;
		for(int j=0;j<g[v].size();j++){
			int x = g[v][j].v;
			int w = g[v][j].w;
			if(!vis[x] && dist[x] >dist[v] + w){
				dist[x] = dist[v] + w;
			}
		}
	}
	return true;
}
int vis2[maxn];
bool solve(){
	memset(vis2,0,sizeof(vis2));
	vis2[di[1]] = 1;
	for(int i=2;i<=n;i++){
		int mind = inf;
		for(int j=1;j<=n;j++){
			if(!vis2[j] && dist[j] <= mind){
				mind = dist[j];
			}
		}
		if(mind != dist[di[i]])
			return false;
		vis2[di[i]] = 1;
	}
	return true;
}

void solve2(){
	int visit[n + 1];
	for (int i = 1; i <= n; i++) visit[i] = 0;
	int start = di[1];
	visit[start] = 1;
	bool flag = false;
	for (int i = 2; i <= n; i++) {
		int mine = dist[di[i]];
		visit[di[i]] = 1;
		for (int j = 1; j <= n; j++) {
			if (visit[di[j]]) continue;
			int curv = dist[di[j]];
			if (mine >= curv) mine = curv;
		}
		if (mine < dist[di[i]]) {
			cout << "No" << endl;
			flag = true;
			break;
		}
	}
	if (flag == false) cout << "Yes" << endl;
}

int main(){
	cin>>n>>e;
	for(int i=1;i<=e;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back(edge(v,w));
		g[v].push_back(edge(u,w));
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		for(int j=1;j<=n;j++) cin>>di[j];
		int st = di[1];
		dijkstra(st);
//		solve2();
		if(solve()){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
	return 0;
}

原文地址:https://www.cnblogs.com/fisherss/p/11615671.html

时间: 2024-08-03 21:59:04

PAT(甲级)2019年秋季考试的相关文章

PAT(甲级)2017年秋季考试

PAT(甲级)2017年秋季考试 还有一题由于上午心情复杂..没调试完.待补. A Cut Integer 模拟题 #include<bits/stdc++.h> using namespace std; typedef long long ll; int n; int getLen(ll x){ int len = 0; while(x){ len++; x/=10; } return len; } int main(){ cin>>n; while(n--){ ll x; ci

PAT甲级考试题库1001 A+B Format 代码实现及相关知识学习

准备参加九年九月份的PAT甲级证书考试,对网站上的题目进行总结分析: 1001题 A+B Format (20 分) Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits). 计算a+b的值并以一定格式输出其和sum(数字需要

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

PAT甲级考前整理

终于在考前,刷完PAT甲级130道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种境界.PAT甲级题目总的说卡题目的比较多,卡测试点的比较少,有些题目还会有题意混淆,这点就不吐槽了吧.静下心来耍这130道题,其实磨练的是一种态度与手感,养成的是一种习惯.热爱AC没有错!! 130道题目主要的考点: 1.排序:快速排序,直接插入排序,希尔排序,分治排序,堆排序. 2.图论:拓扑排序.最短路径.深度搜索.广度搜索. 3.树:树的遍历.完全二叉树.AVL. 4.其他:并查集,模拟,哈希.背包.

2019年一级建造师考试复习的五个关键点

在没有走出考场之前,相信没有任何一位考生可以自信地表示一定能通过考试,不过,充足的复习准备可以提高考试的通关率.为了帮助一级建造师考生做好充足的准备,小编特整理了2019年一级建造师考试复习的五个关键点,供大家参考,一起来看看吧. 目标 目标从来都是一种引领,没有明确目标的复习注定是没有多大成效的劳动,但如果目标管理不当又会给自身造成很大的伤害.因此,一轮复习结束,要好好地回想原定的复习目标,逐一进行检查,明白既定目标实现的情况,做到已经实现.即将实现和有待实现的目标清楚明白.这是锁好目标口的关

PAT甲级专题|最短路

PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做,只能得20分 #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 510; int cmax,n,ter,m; int caps[maxn]; int g[maxn][m

【PAT甲级】1070 Mooncake (25 分)(贪心水中水)

题意: 输入两个正整数N和M(存疑M是否为整数,N<=1000,M<=500)表示月饼的种数和市场对于月饼的最大需求,接着输入N个正整数表示某种月饼的库存,再输入N个正数表示某种月饼库存全部出手的利润.输出最大利润. trick: 测试点2可能包含M不为整数的数据.(尽管题面说明M是正整数,可是根据从前PAT甲级题目的经验,有可能不是整数.....) 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using names

2019年春PAT甲级考试

这次考试不是很理想,一道题目没能做完. 自己原因差不多三条: 1.自己实力不够,准备时间也有点仓促,自己没能做到每道题目都有清晰的思路. 2.考试的心里素质不行,因为设备原因东奔西跑浪费了听过时间,自己心态有点不稳. 3.考场选择的太糟糕了,老师超级不负责任,设施也真的无语,电脑也无法复制测试用例,测试的时候必须要手动输入:老旧的机器,编译器只有2010年的vc和vs. 接下来自己要保持每天的练习,9月份换个考场再参加考试.今年的题目第四道反而不是很难,但是第三道题目条件比较多,因为中途更换机器

PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】

Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting victims lose their entire life savings. To stop this crime, you are supposed to write a program to detect those suspects from a huge amount of phone c