uva10570 Meeting with Aliens
先证明把每次i放到i位置最后次数最少:感觉,可以,用归纳法?
//在序列后再加一个相同的序列,就可以模拟用各个数字开头的情况了
每个位置不对的只需要换一次
54123 ,5固定->41235变成12345
任何一个数固定不变,都相当于从这种情况对应的1所在的位置开始排一遍12345.(例如54123 ,5固定->41235变成12345)所以只需要每个位置开始都判断变成12345所需步数即可
把输入倒过来看,变成12345就相当于正着变成54321 (这个对称很巧妙啊),可以模块化
#include <cstdio>
#include <algorithm>
using namespace std; int cal(int A[], int N) { //54123—>12345可以看做12354->12345所以每个位置开始都判断变成12345所需步数即可
int cnt = , vis[] = {};
for (int i = ; i <= N; i++) //cnt统计不用换位的个数;不用换位的A[j]就等于j,进入下一个数了
if(!vis[i]) { //某个数还没到正确位置
cnt++;
for (int j = i; !vis[j]; j = A[j]) //这个循环中一直换位直到不用换
vis[j] = ;
}
return N - cnt;
} int main() {
int N, A[], B[];
while (scanf("%d", &N), N) {
for (int i = ; i <= N; i++) {
scanf("%d", &A[i]);
B[N - i + ] = B[ * N - i + ] = A[i + N] = A[i];
} int ans = << ;
for (int i = ; i < N; i++)
ans = min(ans, cal(A + i, N)); for (int i = ; i < N; i++)
ans = min(ans, cal(B + i, N)); printf("%d\n", ans);
} return ;
} #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = ;
int p[N],k[N],w[N];
int f[N],n; int solve(int s, int d) {
int cnt = ;
for(int i = ; i <= n; i++) {
if(k[i] != s) {
cnt++;
k[w[s]] = k[i];
w[k[i]] = w[s];
k[i] = s;
w[s] = i;
}
s += d;
if(s > n)
s = ;
if(s <= )
s = n;
}
return cnt;
}
int main() {
while(scanf("%d",&n) && n) {
for(int i = ; i <= n; i++) {
scanf("%d",&p[i]);
f[p[i]] = i;
}
int Min = 0x3f3f3f3f;
for(int i = ; i <= n; i++) {
memcpy(k, p, sizeof(p));
memcpy(w, f, sizeof(f));
Min = min(Min, solve(i,-));
memcpy(k, p, sizeof(p));
memcpy(w, f, sizeof(f));
Min = min(Min, solve(i,));
}
printf("%d\n",Min);
}
}
uva10570 Meeting with Aliens的更多相关文章
- UVA-10570 Meeting with Aliens (枚举+贪心)
题目大意:将一个1~n的环形排列变成升序的,最少需要几次操作?每次操作可以交换任意两个数字. 题目分析:枚举出1的位置.贪心策略:每次操作都保证至少一个数字交换到正确位置上. # include< ...
- UVA 10570 Meeting with Aliens
题意: N个外星人围成一桌坐下,有序的排列指N在N-1与N+1中间,现在给出一个序列,问至少交换几次可以得到有序的序列. 分析: 复制一遍输入序列,放在原序列之后.相当于环.通过枚举,可以把最小交换次 ...
- UVa 10570 Meeting with Aliens (暴力)
题意:给定一个排列,每次可交换两个数,用最少的次数把它变成一个1~n的环状排列. 析:暴力题.很容易想到,把所有的情况都算一下,然后再选出次数最少的那一个,也就是说,我们把所有的可能的形成环状排列全算 ...
- UVA - 10570 Meeting with Aliens (置换的循环节)
给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能) ...
- UVA 10570 Meeting with Aliens 外星人聚会
题意:给你一个排列,每次可以交换两个整数(不一定要相邻),求最少交换次数把排列变成一个1~n的环形排列.(正反都算) 其实就是找环了,对于一个链状序列,最小交换次数等于不在对应位置的数字个数减去环的个 ...
- 【习题 8-13 UVA - 10570】Meeting with Aliens
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举1的位置在i 往右摆成一排. a[i+1]..a[n]..a[1]..a[i-1]变为有序的 ->寻找循环节,每个循环节的 ...
- UVA - 10570 Meeting with Aliens(外星人聚会)(暴力枚举)
题意:输入1~n的一个排列(3<=n<=500),每次可以交换两个整数.用最少的交换次数把排列变成1~n的一个环状序列. 分析:正序反序皆可.枚举每一个起点,求最少交换次数,取最小值. 求 ...
- 【uva 10570】Meeting with Aliens(算法效率--暴力+贪心)
题意:输入1~N的一个排列,每次可以交换2个整数,问使排列变成1~N的一个环状排列所需的虽少交换次数.(3≤N≤500) 解法:(又是一道我没打代码,光想和看就花了很久时间的题~QwQ)由于n很小,可 ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
随机推荐
- 【HNOI 2002】 营业额统计
[题目链接] 点击打开链接 [算法] 观察式子 : 最小波动值 = min{|该天营业额 - 之前某天的营业额|} = min{该天营业额 - 该天营业额的前驱,该天营业额的后继 - 该天营业额} 用 ...
- yui压缩js文件
http://ganquan.info/yui/?hl=zh-CN yui压缩js文件 在工程中,js文件的管理是个麻烦事,并且随着项目越做越多,各种js文件混杂,有时候一个页面需要加载好多js文件, ...
- MariaDB + Visual Studio 2017 环境下的 ODBC 入门开发
参考: Easysoft公司提供的ODBC教程 微软提供的ODBC文档 环境: Windows 10 x64 1803 MariaDB TX 10.2.14 x64 MariaDB ODBC Conn ...
- Rational Rose 2007 &Rational Rose 2003 下载及破解方法和汉化文件下载
Rational Rose 2007 &Rational Rose 2003 下载及破解方法和汉化文件下载 分类: 其它2010-08-10 13:28 12926人阅读 评论(4) 收藏 举 ...
- 使用git rebase合并多次commit
使用git rebase合并多次commit 聊下 git rebase -i
- 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时26&&27
课时26 图像分割与注意力模型(上) 语义分割:我们有输入图像和固定的几个图像分类,任务是我们想要输入一个图像,然后我们要标记每个像素所属的标签为固定数据类中的一个 使用卷积神经,网络为每个小区块进行 ...
- NOJ2026:Keroro侵略地球(01字典树)
传送门 题意 略 分析 将n个数插入字典树中,m次查询,取最大值,复杂度\(O(mlogn)\) trick 1.注意题目给的空间,开40刚刚够(62852K) 2.作为01字典树的模板保存了 代码 ...
- SpringAOP和Spring事物管理
Spring AOP : Pointcut表达式: designators-指示器 wildcards-通配符 operators-操作符 wildcards: * -- 匹配任意数量的字符 + -- ...
- JSP | 基础 | JSP行为 | incline && forward
语法 描述 jsp:include 用于在当前页面中包含静态或动态资源 jsp:forward 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 index.jsp <%@ ...
- C语言-------指针函数与函数指针的区别
一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某 ...