uva 11330 - Andy's Shoes(置换)

题目链接:uva 11330 - Andy‘s Shoes

题目大意:小andy有很多鞋,穿完到处丢,后来他把所有鞋都放回鞋架排成一排,保证了鞋的左右交替,但是颜色混了。问说他至少移动多少次可以将鞋分类好。

解题思路:对应奇数位置为左鞋,偶数位置为右鞋,一双鞋只有一只左鞋和一只右鞋,保证不换左变鞋子,以左鞋的位置为基准换右边鞋子,对应右边鞋子的位置即为一个置换,将置换的循环分解为x个互不相干的循环,ans=n-x

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1e4+5;

int n, pos[maxn], v[maxn], arr[maxn];

int solve () {
    int ret = 0;
    memset(v, 0, sizeof(v));
    for (int i = 0; i < n; i++) {
        if (v[i])
            continue;

        ret++;

        int mv = i;
        while (v[mv] == 0) {
            v[mv] = 1;
            mv = arr[mv];
        }
    }
    return ret;
}

int main () {
    int cas, x;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d", &n);
        for (int i = 0; i < 2 * n; i++) {
            if (i&1)
                scanf("%d", &arr[i/2]);
            else {
                scanf("%d", &x);
                pos[x] = i/2;
            }
        }

        for (int i = 0; i < n; i++)
            arr[i] = pos[arr[i]];
        printf("%d\n", n - solve());
    }
    return 0;
}

uva 11330 - Andy's Shoes(置换),布布扣,bubuko.com

uva 11330 - Andy's Shoes(置换)

时间: 2024-10-14 18:53:53

uva 11330 - Andy's Shoes(置换)的相关文章

UVA 11330 - Andy&#39;s Shoes(置换分解)

UVA 11330 - Andy's Shoes 题目链接 题意:andy有很多双鞋子,每双鞋子有一个编号,现在他把鞋子左右左右放回去,可是不能保证所有鞋子左边和右边是同一编号,现在要求用最少的交换次数,使得所有鞋子左右编号相同 思路:置换的分解,固定左边的鞋子,这样右边的鞋子就可以看成是放在哪个位置,然后根据这个求出每个循环的长度,最后每个循环长度-1的总和就是答案 代码: #include <cstdio> #include <cstring> int t, n, vis[10

UVa 11330 - Andy&#39;s Shoes

题目:有双配对出错鞋子,要求最少的交换次数,使得鞋子配对摆放. 分析:组合数学,置换群.统计置换中循环的个数k,则结果为n-k. 循环内部(设有m个元素)需要交换m-1次(除最后一次,每次交换最多只能有一个复位) 说明:注意鞋子的编号不一定是1~n,是1~10000之间的数字,计算时需要做映射. #include <cstdlib> #include <cstdio> int value[10011]; int Lshoes[10011]; int Rshoes[10011]; i

UVa 11330 (置换 循环的分解) Andy&#39;s Shoes

和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. 1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 using namespace std; 5 6 bool vis[10000 + 10]; 7 8 int main() 9 { 10 //freopen("in.txt",

UVA - 10815 Andy&#39;s First Dictionary

1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <set> 5 using namespace std; 6 7 set<string> out; 8 9 int main() 10 { 11 string s,temp; 12 while(cin>>s) 13 { 14 int len(s.size()); 15 for(int

UVa - 10815 Andy&#39;s First Dictionary(STL)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18649 #include <iostream> #include <string> #include <set> #include <sstream> using namespace std; /******************************************************************

UVA - 10733 The Colored Cubes (置换)

All 6 sides of a cube are to becoated with paint. Each side is is coated uniformly with one color. When a selectionof n different colors of paint is available, how many different cubes can youmake? Note that any two cubes are onlyto be called "differ

UVA 10815 Andy&#39;s First Dictionary(字符处理)

Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy task for him, as the number of words that he knows is, well, not quite enough. Instead of thinking up all the words himself, he has a briliant idea. From his book

uva 716 - Commedia dell&#39; arte(置换)

题目链接:uva 716 - Commedia dell' arte 题目大意:给定一个三维的八数码,0表示空的位置,问说是否可以排回有序序列. 解题思路:对于n为奇数的情况,考虑三维八数码对应以为状态下去除0的时候逆序对数,偶数的情况下,考虑将0的位置转移到(n,n,n)位置后对应序列的逆序对数.如果逆序对数为偶数即为可以,奇数不可以. #include <cstdio> #include <cstring> #include <algorithm> using na

uva 12103 - Leonardo&#39;s Notebook(置换)

题目链接:uva 12103 - Leonardo's Notebook 题目大意:给出26个字母的置换,问是否存在一个置换A,使得A2=B 解题思路:将给定置换分解成若干个不相干的循环,当循环的长度n为奇数时,可以由两个循环长度为n的循环的乘积得来,也可以由两个循环长度为2n的拆分而来:对于长度n为偶数的,只能由两个循环长度为2n的拆分而来,所以判断是否存在有循环长度为偶数的个数是奇数个即可. #include <cstdio> #include <cstring> #inclu