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;
}