uva 11330 - Andy's Shoes(置换)
2014-08-14 00:52
330 查看
题目链接:uva 11330 - Andy's Shoes
题目大意:小andy有很多鞋,穿完到处丢,后来他把所有鞋都放回鞋架排成一排,保证了鞋的左右交替,但是颜色混了。问说他至少移动多少次可以将鞋分类好。
解题思路:对应奇数位置为左鞋,偶数位置为右鞋,一双鞋只有一只左鞋和一只右鞋,保证不换左变鞋子,以左鞋的位置为基准换右边鞋子,对应右边鞋子的位置即为一个置换,将置换的循环分解为x个互不相干的循环,ans=n-x
题目大意:小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(置换分解)
- UVA 11330 Andy's Shoes(置换)
- UVa 11330 (置换 循环的分解) Andy's Shoes
- UVa 11330 - Andy's Shoes
- UVA - 10815 Andy's First Dictionary
- UVA - 10815 Andy's First Dictionary
- UVa 10815 - Andy's First Dictionary
- Uva10815——Andy's First Dictionary
- UVA - 10601 Cubes (组合+置换)
- UVA10815 Andy's First Dictionary
- Uva10601 立方体 置换
- UVa 10294 Arif in Dhaka (First Love Part 2)(置换)
- UVa_10815 - Andy's First Dictionary
- UVA ~ 10815 ~ Andy's First Dictionary(set+字符串处理)
- UVA 10815 Andy's First Dictionary
- UVA10815 Andy's First Dictionary(字符串)
- uva-10815-Andy's First Dictionary-stl-set
- UVA 10815 Andy's First Dictionary
- uva 1156 - Pixel Shuffle(模拟+置换)
- UVA 10815 - Andy's First Dictionary