阿瓦的手套

题目描述
阿瓦所在的幻想世界迎来冬季啦! 阿瓦是只可爱的小猫,她为了这个冬天买了好多好多的手套,兔阿卡举办了一个长长的冬眠营并邀请了阿瓦参 加,阿瓦准备每天都戴不同的手套。 兔阿卡举办的冬眠营一共有 T 天,每一天的早晨,阿瓦都早早地起床挑选手套。她一共有 n 只手套,每只手 套都互不相同,但都有一个主要的颜色 Ci,不同手套的颜色可能是相同的。 阿瓦每天会在所有的 n 只手套中挑选两只,她觉得不同颜色的手套戴在手上不是很好看,于是她想出了一个 方法:她可以在冬眠营开始之前,找阿卡帮助她把其中几只手套的颜色涂成别的颜色,但是注意,冬眠营一旦开始 以后,这 n 只手套的颜色就不能再变了。 阿瓦在冬眠营开始之前已经制定好了每天要戴哪两只手套的计划,你需要告诉她最少需要修改几只手套的颜 色,使得按照阿瓦的计划戴手套的情况下,每天戴的两只手套颜色都一样

输入
第一行,一个整数 n,表示阿瓦的手套只数。
第二行,n 个整数,第 i 个数 Ci 表示第 i 只手套初始的颜色。
第三行,一个整数 T,表示阿卡举办的冬眠营的天数。
接下来有 T 行,每行两个整数 i,j。分别表示阿瓦在这天挑选的两只手套的编号。

输出
共一行,一个整数,表示最少需要修改的手套的颜色数。

样例输入
5
2 2 2 2 1
4
2 4
5 3
4 3
5 2

样例输出
1

并查集输入的手套,然后再一重循环更新自己的父亲,再用一个数组存一下,每个家族里不同颜色的个数,一样颜色最多的可以不用变,然后把总数减去一样的数目,就是要改动颜色的ans

#include<bits/stdc++.h>
using namespace std;
int fa[150000];
int n,a[150000],ans;
map<int ,int>q[150000],p,pp;
 
int m;
int getfa(int x)//找爸爸
{
    
    
  if(fa[x]==x)return x;
  return fa[x]=getfa(fa[x]);
}
int main()
{
    
    
   cin>>n;int sum=n;
   for(int i=1;i<=n;i++)fa[i]=i;
   for(int i=1;i<=n;i++)cin>>a[i],pp[i]=a[i]; 
   cin>>m;
   for(int i=1;i<=m;i++)
   {
    
    
     int x,y;cin>>x>>y;
     int xx=getfa(x);
     int yy=getfa(y);
     if(xx!=yy)fa[xx]=yy;
   }
    
   for(int i=1;i<=n;i++)getfa(i);//更新祖先
   /* for(int i=1;i<=n;i++)cout<<fa[i]<<' ';
    cout<<endl;*/
   for(int i=1;i<=n;i++)
   {
    
    
     q[fa[i]][a[i]]++;
     if(q[fa[i]][a[i]]>p[fa[i]])p[fa[i]]=q[fa[i]][a[i]];//如果这种颜色更多,更新
   }
   for(int i=1;i<=n;i++)if(fa[i]==i)sum-=p[fa[i]];//同种颜色不用变
   cout<<sum;
   return 0;
}

猜你喜欢

转载自blog.csdn.net/yhhy666/article/details/108223373