题意:给你一个排列,每次可以交换两个整数(不一定要相邻),求最少交换次数把排列变成一个1~n的环形排列。(正反都算)

其实就是找环了,对于一个链状序列,最小交换次数等于不在对应位置的数字个数减去环的个数。

至于证明这里讲的比较详细:http://www.dewen.io/q/7967#ans16319

所以只要枚举一下环的起点就好了,dfs找环就行了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+;
#define bug(x) cout<<#x<<'='<<x<<endl;
int a[maxn]; bool vis[maxn]; int cnt,s;
void dfs(int u)
{
if(vis[u]) return;
cnt++;
vis[u] = true;
dfs(a[u+s]);
}
int n; void dfs2(int u)
{
if(vis[n--u]) return;
cnt++;
vis[n--u] = true;
dfs2(a[n--u+s]);
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n)&&n){
for(int i = ; i < n; i++){
scanf("%d",a+i); a[i+n] = --a[i];
} int ans = INT_MAX;
for( s = ; s < n; s++){
int cur = ;
memset(vis,,sizeof(vis));
for(int i = ; i < n; i++)if(!vis[i]) {
if(a[i+s] != i) {
vis[i] = true; cnt = ;
dfs(a[i+s]);
cur += cnt;
}else vis[i] = true;
}
ans = min(ans,cur);
}
reverse(a,a+*n);
for( s = ; s < n; s++){
int cur = ;
memset(vis,,sizeof(vis));
for(int i = ; i < n; i++)if(!vis[i]) {
if(a[i+s] != i) {
vis[i] = true; cnt = ;
dfs(a[i+s]);
cur += cnt;
}else vis[i] = true;
}
ans = min(ans,cur);
} printf("%d\n",ans);
}
return ;
}

UVA 10570 Meeting with Aliens 外星人聚会的更多相关文章

  1. UVA - 10570 Meeting with Aliens(外星人聚会)(暴力枚举)

    题意:输入1~n的一个排列(3<=n<=500),每次可以交换两个整数.用最少的交换次数把排列变成1~n的一个环状序列. 分析:正序反序皆可.枚举每一个起点,求最少交换次数,取最小值. 求 ...

  2. UVA 10570 Meeting with Aliens

    题意: N个外星人围成一桌坐下,有序的排列指N在N-1与N+1中间,现在给出一个序列,问至少交换几次可以得到有序的序列. 分析: 复制一遍输入序列,放在原序列之后.相当于环.通过枚举,可以把最小交换次 ...

  3. UVa 10570 Meeting with Aliens (暴力)

    题意:给定一个排列,每次可交换两个数,用最少的次数把它变成一个1~n的环状排列. 析:暴力题.很容易想到,把所有的情况都算一下,然后再选出次数最少的那一个,也就是说,我们把所有的可能的形成环状排列全算 ...

  4. UVA - 10570 Meeting with Aliens (置换的循环节)

    给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能) ...

  5. UVA-10570 Meeting with Aliens (枚举+贪心)

    题目大意:将一个1~n的环形排列变成升序的,最少需要几次操作?每次操作可以交换任意两个数字. 题目分析:枚举出1的位置.贪心策略:每次操作都保证至少一个数字交换到正确位置上. # include< ...

  6. UVa 10570 外星人聚会

    https://vjudge.net/problem/UVA-10570 题意:输入1~n的排列,每次可以交换两个整数,求出最少交换次数使之变成有序的环状序列. 思路:主要的解题方法就是寻找置换环,举 ...

  7. 【习题 8-13 UVA - 10570】Meeting with Aliens

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举1的位置在i 往右摆成一排. a[i+1]..a[n]..a[1]..a[i-1]变为有序的 ->寻找循环节,每个循环节的 ...

  8. 【uva 10570】Meeting with Aliens(算法效率--暴力+贪心)

    题意:输入1~N的一个排列,每次可以交换2个整数,问使排列变成1~N的一个环状排列所需的虽少交换次数.(3≤N≤500) 解法:(又是一道我没打代码,光想和看就花了很久时间的题~QwQ)由于n很小,可 ...

  9. uva10570 Meeting with Aliens

    先证明把每次i放到i位置最后次数最少:感觉,可以,用归纳法? //在序列后再加一个相同的序列,就可以模拟用各个数字开头的情况了每个位置不对的只需要换一次54123 ,5固定->41235变成12 ...

随机推荐

  1. 微信小程序开发之下拉菜单

    实现功能:点击维保人员,调出下拉菜单.选择子菜单时,显示右边的图标表示选中,并进行赋值并进行搜索筛选 Wxml: <view class="dtclass" bindtap= ...

  2. oracle查看表,索引,视图,存储过程的定义

    通过  DBMS_METADATA  包 Oracle 的在线文档,对这个包有详细说明: DBMS_METADATA 通过该dbms_metadata包的get_ddl()方法,我们可以查看表,索引, ...

  3. iOS ipa包重签名

    背景:公司做游戏SDK的,提供SDK给第三方后,他们打包过来我们需要分发在不同的渠道,这个时候需要修改SDK的配置文件,ipa文件修改后是需要手机越狱或者ipa重签名才能安装成功的,所以研究了一下重签 ...

  4. 交叉编译调试qemu_guest_agent

    Winodws版本 编译环境Fedora23 下载VSS SDK的setup.exe 下载地址 提取VSS SDK头文件 将下面的代码保存成extract-vsssdk-headers.sh脚本,然后 ...

  5. python读写xlsx

    1使用openpyxl库读写excel xlrd和xlwt处理的是xls文件,单个sheet最大行数是65535,如果有更大需要的,建议使用openpyxl函数,最大行数达到1048576.  如果数 ...

  6. Unity 5.6 beta版本新特性

    http://manew.com/thread-98549-1-1.html 最新发布的beta版改进了编辑器和2D功能,图形性能更佳,加入新的视频播放器,并添加了对Facebook Gameroom ...

  7. axios发送两次请求原因及解决方法

    axios发送两次请求原因及解决方法 最近Vue项目中使用axios组件,在页面交互中发现axios会发送两次请求,一种请求方式为OPTIONS,另外一种为自己设置的. 如图: 什么是CORS通信? ...

  8. Visio画图(一):UML用例图

    Visio画图(一):UML用例图 1.找到UML用例图 A.有网状态 第一步 在搜索框内输入用例图进行搜索. 第二步,移动鼠标直到找到用例图 B.无网状态 第一步 点击特别推荐旁的类别选项 第二步 ...

  9. 转 dos 下的 find 和 重定向 and 删除

    1.find /i "ora-" *.* > check.log del /Q .\log\*.* 附录: 我对findstr是如此的依赖,以至于当我向各位讲解find命令的 ...

  10. scrapy-redis 分布式哔哩哔哩网站用户爬虫

    scrapy里面,对每次请求的url都有一个指纹,这个指纹就是判断url是否被请求过的.默认是开启指纹即一个URL请求一次.如果我们使用分布式在多台机上面爬取数据,为了让爬虫的数据不重复,我们也需要一 ...