L2-026 小字辈 - dfs建树 + 求最大深度
思路:
- 用vector存关系 v[父辈下标]={孩子1下标,孩子2下标……}
- dfs建树 从树根开始建
- dfs逐层向下 深搜每一个节点
- 如果是叶子节点 则用res存 res[深度]={叶节点下标} 并及时更新最大深度h
- 最后输出h 和res[h]里的所有叶子节点
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
unordered_map<int,bool> st;
vector<vector<int>> res;
vector<vector<int>> v;
int h;
void dfs(int u,int d) //u存的是下标
{
st[u]=true;
if(v[u].size()==0) //如果是叶子节点
{
h=max(h,d);
res[d].push_back(u);
return;
}
for(int i=0;i<v[u].size();i++)
if(!st[v[u][i]])
dfs(v[u][i],d+1);
}
int main()
{
int n,root=-1;
cin>>n;
v.resize(n+1);
res.resize(n+1);
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(~x) v[x].push_back(i);
else root=i;
}
dfs(root,1);
cout<<h<<endl;
for(int i=0;i<res[h].size();i++)
{
if(i!=0) cout<<" ";
cout<<res[h][i];
}
return 0;
}
!L1-054 福到了 - 15
思路:
- 把每一行作字符串输入 存入vector容器中
- 把上面的行和下面的行逐一比较 如果是非对称 则标记跳出
- 从右下角开始替换字符
- 最后输出
#include <bits/stdc++.h>
using namespace std;
vector<string> s;
vector<string> res;
int main()
{
char c;
int n;
bool f=false;
cin>>c>>n;
getchar();
for(int i=0;i<n;i++)
{
string str;
getline(cin,str);
s.push_back(str);
}
for(int i=0;i<n;i++)
if(s[i]!=s[n-1-i])
{
f=true;
break;
}
for(int i=s.size()-1;i>=0;i--)
{
string ss;
for(int j=s[i].size()-1;j>=0;j--)
if(s[i][j]!=' ') ss+=c;
else ss+=' ';
res.push_back(ss);
}
if(f) for(auto x:res) cout<<x<<endl;
else
{
cout<<"bu yong dao le"<<endl;
for(auto x:res) cout<<x<<endl;
}
return 0;
}
L1-056 猜数字 - 20
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
map<string,int>mp;
int sum=0,peo=n;
while(n--)
{
string s;
cin>>s;
int t;
cin>>t;
mp[s]=t;
sum+=t;
}
sum=sum/peo/2;
string res;
int minx=0x3f3f3f3f;
for(auto x:mp)
{
int d=abs(x.second-sum);
if(d<minx)
{
minx=d;
res=x.first;
}
}
cout<<sum<<" "<<res;
}
L1-055 谁是赢家 - 10
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
int pa=0,pb=0;
cin>>a>>b;
for(int i=0;i<3;i++)
{
int x;
cin>>x;
if(x==0) pa++;
else pb++;
}
if(a>b&&pa>=1) printf("The winner is a: %d + %d",a,pa);
else printf("The winner is b: %d + %d",b,pb);
}