7-9 小字辈:
开始使用并查集暴力做的,结果超时。
正确思路:
用嵌套的vector存储每个人的下一辈有谁,之后记录祖宗,再dfs。
之前学STL的时候没学vector,之前学习的dfs也差不多忘了,通过这道题再复习了一下。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<vector<int>>h;
set<int>u;
set<int>::iterator p;
int mmax=-1;
void dfs(int person,int heaght)
{
if(heaght>mmax)
{
mmax=heaght;
u.clear();
u.insert(person);
}
else if(heaght==mmax)
{
u.insert(person);
}
for(int i=0;i<h[person].size();i++)
{
dfs(h[person][i],heaght+1);
}
}
int main()
{
int n,i,j,k;
cin>>n;
h.resize(n+1);
int ancestor;
for(i=1;i<=n;i++)
{
cin>>j;
if(j==-1)
{
ancestor=i;
}
else
{
h[j].push_back(i);
}
}
// int heaght=0;
dfs(ancestor,1);
cout<<mmax<<endl;
for(p=u.begin();p!=u.end();p++)
{
if(p==u.begin())
{
cout<<*p;
}
else
{
cout<<" "<<*p;
}
}
return 0;
}
7-10 抢红包:
WA在第一个点半天,上网查了后才知道要先以分为单位进行加减,最后再×0.01,不然会造成结构体排序错误。。。。。
避免高精度加减。
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct f
{
int num;
double money=0;
int sum=0;
}per[10000+8];
bool cmp(f i,f j)
{
if(i.money==j.money)
{
return i.sum>j.sum;
}
if(i.sum==j.sum&&i.money==j.money)
{
return i.num<j.num;
}
return i.money>j.money;
}
int main()
{
int n,i,j,k;
float y;
cin>>n;
for(i=1;i<=n;i++)
{
float tem=0;
per[i].num=i;
cin>>k;
while(k--)
{
cin>>j>>y;
tem+=y;
per[j].money+=y;
per[j].sum++;
}
per[i].money-=tem;
}
//cout<<fixed<<setprecision(5)<<"5:"<<" "<<per[5].money<<" "<<per[5].num<<" "<<per[5].sum<<endl;
//cout<<"10:"<<" "<<per[10].money<<" "<<per[10].num<<" "<<per[10].sum<<endl;
sort(per+1,per+n+1,cmp);
for(i=1;i<=n;i++)
{
cout<<per[i].num<<' ';
cout<<fixed<<setprecision(2)<<per[i].money/100<<endl;
}
return 0;
}
7-12深入虎穴:
开始也是用并查集暴力解的,结果超时,受上面7-9的启发,改用vector的嵌套加dfs,先把每个节点的子节点存储起来,然后找出根节点,再dfs每个节点的子节点,找出最深的那一个即可。
需要注意的是vector在使用前需要初始化:v.resize(n+1);
代码如下:
#include<iostream>
#include<set>
#include<vector>
using namespace std;
vector<vector<int>>v;
//vector<vector<int>>h;
int a[100000+8]={0};
set<int>s;
int mmax=-1;
void dfs(int u,int heaght)
{
if(heaght>mmax)
{
mmax=heaght;
s.clear();
s.insert(u);
}
for(int i=0;i<v[u].size();i++)
{
dfs(v[u][i],heaght+1);
}
}
int main()
{
int n,i,j,k,root;
cin>>n;
v.resize(n+1);
for(i=1;i<=n;i++)
{
cin>>k;
while(k--)
{
cin>>j;
v[i].push_back(j);
//h[j].push_back(i);
a[j]=1;
}
}
for(i=1;i<=n;i++)
{
if(a[i]==0)
{
root=i;
break;
}
}
int heaght;
dfs(root,1);
//out<<mmax<<endl;
set<int>::iterator p;
p=s.begin();
cout<<*p<<endl;
return 0;
}