首页 > 其他 > 详细

codeforces 756A

时间:2017-02-17 21:16:12      阅读:267      评论:0      收藏:0      [点我收藏+]

Input

4
4 3 2 1
0 1 1 1
Output
2

4个饼 每一秒 都会到对应 上面一行的位置
0的话不翻转 1 翻转
要求 每个饼要到所有的位置
而且正反面都要到过所有的位置
我是思路是并查集 先看看有多少个换
显然是要和到一起的
然后1的个数如果是偶数的话就有问题 最少改变多少个数
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>

using namespace std;

#define MAXN  200010
int z[MAXN];
int x[MAXN];
int find1(int a)
{
    if(a==z[a])
        return a;
    else
    {
        int b=find1(z[a]);
        return z[a]=b;
    }
}
int c[5];
int main ()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        z[i]=i;

    for(int i=1;i<=n;i++)
    {
        int a,b,fa,fb;
        scanf("%d",&a);
        fa=find1(i);
        fb=find1(a);
        if(fa!=fb)
            z[fa]=z[fb];
    }
    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        c[a]++;
    }
    int ans1=0;
    for(int i=1;i<=n;i++)
    {
         x[i]=find1(i);
         if(i==x[i])
         {
             ans1++;
         }
    }
    if(ans1==1)
        ans1--;
    if(c[1]%2==0)
        ans1++;

    printf("%d\n",ans1);
    return 0;
}

 

codeforces 756A

原文:http://www.cnblogs.com/cherryMJY/p/6411411.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!