UVA 10570 Meeting with Aliens
来源:互联网 发布:druid优化 编辑:程序博客网 时间:2024/04/29 17:08
题意:输入一个1~n的排列 ,每次可以交换两个整数。用最少的交换次数把排列变成1~n的一个环状排列。
首先一个排列通过交换任意两数字得到另一排列的最小次数 取决于把第二个排列看成映射时 互不干扰的集合(不太会描述)的数目
例如: 排列1: 1, 2,3, 4,5,6, 7,8,9,10, 11
排列2: 1, 3,2, 6,4,5 ,8,9,10,7, 11
即可分成5个集合 {1}, {2,3}, {4,5,6}, {7,8,9,10},{11}
所以从排列1到2的最小交换次数为 11 - 5 = 6 (从小规模的数据就可以看出,不过只是自己找的规律,不知道是不是什么定理,也没证明过~)
而对于这道题,其目标排列有2*n种(枚举1的位置 和排列中数递增的方向)
再计算每个符合要求排列跟当前排列的次数即可
#include<iostream>#include<cstdio>#include<cstring>#include<cctype>#include<cmath>#include<vector>#include<queue>#include<map>#include<algorithm>#include<set>#define scnaf scanf#define cahr char#define bug puts("bugbugbug");using namespace std;typedef long long ll;typedef pair<int,int> pii;const int mod=1000000007;const int maxn=500+10;const int inf=1e9;int a[maxn],b[maxn],c[maxn],visit[maxn],f[maxn];int n,ans;void init(int x){ for(int i=0;i<n;i++) b[(x+i)%n]=c[(x-i+n)%n]=i+1;}void go(){ memset(visit,0,sizeof(visit)); int cnt=0; for(int i=0;i<n;i++) if(!visit[i]) { cnt++; int next=i; while(b[next]!=a[i]) { visit[next]=1; next=f[b[next]]; } visit[next]=1; } ans=max(ans,cnt); cnt=0; memset(visit,0,sizeof(visit)); for(int i=0;i<n;i++) if(!visit[i]) { cnt++; int next=i; while(c[next]!=a[i]) { visit[next]=1; next=f[c[next]]; } visit[next]=1; } ans=max(ans,cnt);}int main(){ while(~scanf("%d",&n)&&n) { ans=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); f[a[i]]=i;//查询某个数的位置 } for(int i=1;i<=n;i++)//数字1的位置 { init(i);//构造正向和反向两条串 go(); } printf("%d\n",n-ans); }}
0 0
- UVA 10570 Meeting with Aliens
- UVA 10570 Meeting with Aliens
- UVA 10570 Meeting with Aliens
- uva 10570 - Meeting with Aliens
- uva 10570 Meeting with Aliens
- UVa 10570 Meeting with Aliens
- UVA - 10570 Meeting with Aliens
- UVa - 10570 - Meeting with Aliens
- uva 10570 meeting with aliens
- UVA 10570 Meeting with Aliens
- UVA 10570 Meeting with Aliens
- Meeting with Aliens UVA
- Meeting with Aliens UVA
- UVA - 10570 Meeting with Aliens 暴力
- UVa 10570:Meeting with Aliens(贪心)
- uva 10570——Meeting with Aliens
- uva 10570—— Meeting with Aliens
- UVa 10570 Meeting with Aliens(思路)
- 多线程资源共享
- 黑马程序员-----@class的使用
- android内存管理
- 正则表达式
- #13 LeetCode——Roman to Integer
- UVA 10570 Meeting with Aliens
- Django: 'module' object has no attribute 'index'
- mysql分库分表
- 比较实用的ADT快捷键
- 51nod 算法马拉松6(索函数)(规律题目)
- 【内存优化】SparseArray源码分析
- XML_SAX_解析本地文件
- spring整合hibernate配置注解事务的相关问题
- Android 广播接收