PTA刷题日记03

1021 Deepest Root (25 分)

求树的深度一般两遍dfs就能解决,这题的问题在于记录所有可以求得树的最大深度的结点,并且如果不连通就另外处理
第一遍dfs得到的最大深度的结点一定在所求集合中,还有一些漏掉的结点第二遍dfs处理即可

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
set<int> ans;
vector<int> ver[N];
int d[N],v[N],dst = -1, p;

void dfs(int x, int depth) {
//	cout<<x<<":"<<depth<<endl;
	v[x] = 1;
	d[x] = max(d[x], depth);
	for(int i = 0; i < ver[x].size(); i++) {
		int y = ver[x][i];
		if(v[y])continue;
		dfs(y, depth+1);
	}
	if(d[x] > dst) {
		dst = d[x];
		p = x;
	}
	return;
}


int main() {
	int n, cnt = 0;
	cin >> n;
	for(int i = 0; i < n-1; i++) {
		int x,y;
		cin >> x >> y;
		ver[x].push_back(y);
		ver[y].push_back(x);
	}
	for(int i = 1; i <= n; i++) {
		if(!v[i]){
			dfs(i, 1);
			cnt++;
		}
	}
	if(cnt > 1) printf("Error: %d components",cnt);
	else {
		for(int i = 1; i <= n; i++) {
			if(d[i] == dst) ans.insert(i);
		}
		memset(v,0,sizeof(v));
		dfs(p,1);
		for(int i = 1; i <= n; i++) {
			if(d[i] == dst) ans.insert(i);
		}
		for(auto it: ans){
			cout<<it<<endl;
		}
	}
	
	return 0;
}

1022 Digital Library (30 分)

map处理题,注意点一是读取方式的处理是getline,只有这样才能读到空格,对字符串的读取方式要熟;注意点二是无论何种查询方式都是只需要输出id号,那么只需要将书名,作者等信息和id号做一个映射即可啦

#include<bits/stdc++.h> 
using namespace std;
map<string, set<string> >mp1, mp2, mp3, mp4, mp5;

void print(set<string> st) {
	if(!st.size()) cout<<"Not Found"<<endl;
	else {
		for(auto it: st) {
			cout<<it<<endl;
		}
	}
}

int main() {
	int n,m;
	cin >> n;
	getchar();
	while(n --) {
		string id,a,b,c,d,e;
		getline(cin, id); 
		getline(cin, a); mp1[a].insert(id);
		getline(cin, b); mp2[b].insert(id);
		getline(cin, c);
		string tem = "";
		for(int i = 0; i < c.length(); i++) {
			if(c[i] == ' ') {
//				cout<<tem<<endl;
				mp3[tem].insert(id);
				i++;
				tem = "";
			}
			tem += c[i];
		}
		mp3[tem].insert(id);
		getline(cin, d); mp4[d].insert(id);
		getline(cin, e); mp5[e].insert(id);
//		cout<<a<<endl;
	}
	cin >> m;
	while(m --) {
		int q;
		string a;
		scanf("%d: ", &q);
		getline(cin, a);
		cout<<q<<": "<<a<<endl;
		switch(q) {
			case 1:{
				print(mp1[a]);
				break;
			}
			case 2:{
				print(mp2[a]);
				break;
			}
			case 3:{
				print(mp3[a]);
				break;
			}
			case 4:{
				print(mp4[a]);
				break;
			}
			case 5:{
				print(mp5[a]);
				break;
			}
		}
	}
	return 0;
}

1027 Colors in Mars (20 分)

进制转换,不足两位补0

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

string radix(int n) {
	string t;
	while(n) {
		int b = n % 13;
		if(b > 9) t += b - 10 + 'A';
		else t += b + '0';
		n /= 13;
	}
	for(int i = t.length(); i < 2; i++) t += '0' ;
	reverse(t.begin(), t.end());
	return t;
}

int main() {
	int a, b, c;
	scanf("%d %d %d",&a, &b, &c);
	string n1 = radix(a), n2 = radix(b), n3 = radix(c);
	printf("#%s%s%s",n1.c_str(),n2.c_str(),n3.c_str());
	return 0;
}

1029 Median (25 分)

合并两个有序数组,如果一个数组遍历完成而还没找到中位数,还要继续遍历另一个数组,这样的情况应该是测试点3,6

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
#define ll long long
int n1, n2;
ll arr1[N], arr2[N];

int main() {
	scanf("%d",&n1);
	for(int i = 0; i < n1; i++) scanf("%lld", arr1+i);
	scanf("%d",&n2);
	for(int i = 0; i < n2; i++) scanf("%lld", arr2+i);
	int i = 0, j = 0, t = 0, p = (n1 + n2 + 1) / 2;
	ll mid;
	while(i < n1 && j < n2) {
		if(t == p) break;
		if(arr1[i] <= arr2[j]) {
			mid = arr1[i];
			i++;
		}
		else {
			mid = arr2[j];
			j++;
		}
		t++;
	}
	while(i < n1) {
		if(t == p) break;
		mid = arr1[i++];
		t++;
	}
	while(j < n2) {
		if(t == p) break;
		mid = arr2[j++];
		t++;
	}
	cout<<mid<<endl;
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值