求解,感觉测试点错了……
  • 板块P2170 选学霸
  • 楼主yanrs1019
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/10 21:10
  • 上次更新2024/4/10 23:53:37
查看原帖
求解,感觉测试点错了……
1304706
yanrs1019楼主2024/4/10 21:10

可能是我对题目理解的问题,只得了27分

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int f[N],point[N];
int main()
{
	int i,j,n,m,k,x,y,cntp=0,ans,far;
	cin>>n>>m>>k;
	if(!k)//k如果是0,直接输出m 
	{
		cout<<m;
		return 0;
	}
	for(i=1;i<=k;i++)
	{
		cin>>x>>y;
		if(!point[x])//x没有分组 
		{
			if(!point[y])//y没有分组
			{
				point[x]=point[y]=++cntp;//归进一个新的组里 
				f[cntp]+=2;
			}
			else//y分组了 
			{
				point[x]=point[y];//都归进y的组里 
				f[point[x]]++;
			} 
		}
		else//x分组了 
		{
			if(!point[y])//y没有分组 
			{
				point[y]=point[x];//都归进x的组里;
				f[point[y]]++;
			}
			else//y分组了 
			{
				//要都归进到x里 
				f[point[y]]=1e9;//y的那一组要设一个最大值 
				for(j=1;j<=i;j++)
				{
					if(point[j]==point[y]&&j!=y)//如果两个组一样,就归进x,但是如果j==y原始的y就会失踪 
					{
						point[j]=point[x];
						f[point[j]]++;
					}
				}
				point[y]=point[x];//最后把y归进x里 
				f[point[y]]++;
			}
		}
	}
	ans=f[1],far=abs(f[1]-m);//打擂台找差距最小 
	for(i=2;i<=cntp;i++)
	{
		if(far>abs(f[i]-m))
		{
			far=abs(f[i]-m);
			ans=f[i];
		}
		else if(far==abs(f[i]-m))
		{
			ans=min(ans,f[i]);
		}
	}
	cout<<ans;
	return 0;
}

2024/4/10 21:10
加载中...