天梯赛-部落、二叉树的最大路径和、集合相似度、链表去重、那就别担心了

部落

题目链接
题意:每个人都有自己的部落,认为朋友的朋友属于同一个部落,即集合中有共同元素就属于同一个部落。要求判断出这个社区的总人数、以及互不相交的部落的个数,随后对每一次查询,判断两个人是否属于同一个部落,属于则输出“Y”,否则输出“N”。
错点:被扣了四分。。
在这里插入图片描述
以下是错误代码。。。但是不清楚为什么会错

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int a[N],f[N];
typedef pair<int,int> pii;
int n,m;
char d;
//部落数量,总人数 
int mount=1,ans=0;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int k;
		scanf("%d",&k);
		int flag=0;
		int idx=0;
		for(int j=1;j<=k;j++)
		{
			scanf("%d",&a[j]);
			ans=max(ans,a[j]); 
			if(f[a[j]]!=0)
			{
				flag=1;
				idx=f[a[j]];
			}
		}
		if(flag==1)
		{
			for(int j=1;j<=k;j++)
			{
				f[a[j]]=idx;
				//cout<<a[j]<<" "<<f[a[j]]<<endl;
			}
		}
		else
		{
			for(int j=1;j<=k;j++)
			{
				f[a[j]]=mount;
				//cout<<a[j]<<" "<<f[a[j]]<<endl;
			}
			mount++;
		}
	}
	cout<<ans<<" "<<mount-1<<endl;
	scanf("%d",&m);
	while(m--)
	{
		int q,d;
		scanf("%d%d",&q,&d);
		if(f[q]==f[d]&&f[q]!=0&&f[d]!=0&&q<=ans&&d<=ans) 
		{
			cout<<"Y"<<endl;
			//cout<<f[q]<<" "<<f[d]<<endl;
		}
		else 
		{
			cout<<"N"<<endl;
			//cout<<f[q]<<" "<<f[d]<<endl;
		}
	}
	return 0;
}

正确代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int a[N];
int n,m;
char d;
//部落数量,总人数 
int mount=1,ans=0;
set<int> pe;
bool vi[N];
int find(int x)
{
	int r=x;
	while(a[r]!=r)
	{
		r=a[r];
	}
	return r;
}
void un(int x,int y)
{
	int px=find(x);
	int py=find(y);
	if(px<py) a[py]=px;
	else a[px]=py;
}
int main()
{
	for(int i=0;i<10001;i++) a[i]=i;
	cin>>n;
	int k,x,y;
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&k,&x);
		pe.insert(x);
		for(int j=0;j<k-1;j++)
		{
			scanf("%d",&y);
			pe.insert(y);
			un(x,y);
			x=y;
		}
	}
	for(int i=1;i<=pe.size();i++)
	{
		int pi=find(i);
		if(vi[pi]==0) ans++,vi[pi]=1;
	}
	cout<<pe.size()<<" "<<ans<<endl;
	cin>>k;
	for(int i=0;i<k;i++)
	{
		scanf("%d%d",&x,&y);
		if(find(x)==find(y)) printf("Y\n");
		else printf("N\n");
	}
	return 0;
}

二叉树的最大路径和

原题链接

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int Max=INT_MIN;
int n=1;
int maxsum(int root)
{
	if(root>n||a[root]==0) return 0;
	int l=max(0,maxsum(root<<1));
	int r=max(0,maxsum(root<<1|1));
	Max=max(Max,l+r+a[root]);
	return max(l,r)+a[root];
}
int main(){
	while(cin>>a[n++]);
	n--;
	maxsum(1);
	cout<<Max;
	return 0;
}

集合相似度

原题链接
暴力,最后一个测试点超时了

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
int a[N][N];
int num[N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int k;
		cin>>k;
		int d=1;
		map<int,int> mp;
		for(int j=1;j<=k;j++)
		{
			int s;
			cin>>s;
			if(mp[s]==0)
			{
				a[i][d]=s;
				d++;
				mp[s]=1;
			}
			else continue;
		}
		num[i]=d-1;
	}
	cin>>m;
	while(m--)
	{
		int x,y;
		cin>>x>>y;
		//sort(a[1]+1,a[1]+1+num[1]);
		//sort(a[1]+1,a[1]+1+num[1]);
		int x1=max(num[x],num[y]);
		int x2=min(num[x],num[y]);
		if(x1==num[y])
		{
			int t;
			t=x;
			x=y;
			y=t;	
		}
		double ans,cnt=0,mount=num[x]+num[y];
		for(int i=1;i<=x2;i++)
		{
			for(int j=1;j<=x1;j++)
			{
				if(a[y][i]==a[x][j])
				{
					cnt++;
				}
			}
		}
		mount-=cnt;
		ans=cnt/mount*100;
		printf("%.2f%\n",ans);
	}
	return 0;
}

正确代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
vector<set<int> >a;
int num[N];
int main()
{
	cin>>n;
	int k,x,y;
	while(n--)
	{
		cin>>k;
		set<int> tmp;
		while(k--)
		{
			cin>>x;
			tmp.insert(x);
		}
		a.push_back(tmp);
	}
	cin>>n;
	while(n--)
	{
		cin>>x>>y;
		vector<int> res(4000);
		auto itt=set_intersection(a[x-1].begin(),a[x-1].end(),a[y-1].begin(),a[y-1].end(),res.begin() );
		int i=itt-res.begin();
		itt=set_union(a[x-1].begin(),a[x-1].end(),a[y-1].begin(),a[y-1].end(),res.begin() );
		int j=itt-res.begin();
		printf("%.2f%\n",100.0*i/j);
	}
	return 0;
}

链表去重

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int co[N],del[N];
struct node{
	int d;
	int w;
	int ne;
}l[N];
queue<int> q;
int c=0,dl=0;
int f[N];
int hea,n;
int main()
{
	cin>>hea>>n;
	for(int i=1;i<=n;i++)
	{
		int u,v,j;
		cin>>u>>v>>j;
		l[u].d=u;
		l[u].w=v;
		l[u].ne=j;
	}
	q.push(hea);
	int cnt=0;
	while(!q.empty())
	{
		int d=q.front();
		q.pop();
		int j=abs(l[d].w);
		if(f[j]==0)
		{
			f[j]=1;
			co[c]=d;
			c++;
		}
		else
		{
			del[dl]=d;
			dl++;
		}
		int y=l[d].ne;
		if(y!=-1) q.push(y);
	}
	for(int i=0;i<c;i++)
	{
		int j=co[i];
		int ne=co[i+1];
		if(i!=c-1)
		{
			printf("%05d %d %05d\n",l[j].d,l[j].w,ne);
		}
		else
		{
			printf("%05d %d %d\n",l[j].d,l[j].w,-1);
		}
	}
	for(int i=0;i<dl;i++)
	{
		int j=del[i];
		int ne=del[i+1];
		if(i!=dl-1)
		{
			printf("%05d %d %05d\n",l[j].d,l[j].w,ne);
		}
		else
		{
			printf("%05d %d %d\n",l[j].d,l[j].w,-1);
		}
	}
	return 0;
}

那就别担心了

原题
简单dfs

#include<bits/stdc++.h>
using namespace std;
const int N=550;
//>=2条路径可以到达,最长路径是否通过 
vector<int> a[N];
int flag=1;
int cnt[N];
queue<int >q;
int n,m;
int dfs(int x,int y)
{
	if(cnt[x]==0)
		for(int t:a[x]) cnt[x] += dfs(t,y);
	if(cnt[x]==0) flag=0;
	return cnt[x];
}
int main()
{
	cin>>n>>m;
	int x,y;
	for(int i=0;i<m;i++)
	{
		cin>>x>>y;
		a[x].push_back(y);
	}
	cin>>x>>y;
	cnt[y]=1;
	int res=dfs(x,y);
	if(flag) cout<<res<<" Yes";
	else cout<<res<<" No";
	return 0;
}

总结

继续加油!!下次要再细心一些,对于学过的算法别忘记了,再熟悉一些,还要额外再去看看STL知识,对于很多很方便的STL应用还是不太熟悉了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值