博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【习题 8-13 UVA - 10570】Meeting with Aliens
阅读量:5037 次
发布时间:2019-06-12

本文共 1678 字,大约阅读时间需要 5 分钟。

【链接】

【题意】

在这里输入题意

【题解】

枚举1的位置在i
往右摆成一排。
a[i+1]..a[n]..a[1]..a[i-1]变为有序的
->寻找循环节,每个循环节的长度-1是必要的步骤数
->获取必要的步骤数,取最小值。
->O(n^2)
往左排成一排
->同样的方法处理就好

【代码】

#include 
using namespace std;const int N = 5e2;int a[N+10],n,cnt;bool flag[N+10];vector
v;int get_step(){ memset(flag,0,sizeof flag); int now = 0; for (int i = 1;i <= n;i++) if (!flag[i]){ int cc = 0,kk = i; while (!flag[kk]){ flag[kk] = true; cc++; kk = v[kk]; } now+=cc-1; } return now;}int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); while (cin >>n && n){ for (int i = 1;i <= n;i++) cin >> a[i]; int j = 1; for (int i = 2;i <= n;i++) if (a[i]==1) j = i; int ans = -1; v.resize(n+1); for (int i = 1;i <= n;i++){ cnt = 0; if (i!=j){ swap(a[i],a[j]); cnt++; } //向右 for (int k = 1,l = i;k <= n;k++,l++){ if (l>n) l = 1; v[k] = a[l]; } int temp1 = get_step(); //向左 for (int k = 1,l = i;k <= n;k++,l--){ if (l<=0) l = n; v[k] = a[l]; } int temp2 = get_step(); if (ans==-1){ ans = cnt+min(temp1,temp2); }else{ ans = min(ans,cnt+min(temp1,temp2)); } if (i!=j) swap(a[i],a[j]); } cout << ans << endl; } return 0;}

转载于:https://www.cnblogs.com/AWCXV/p/8268739.html

你可能感兴趣的文章
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
阿里市值超越亚马逊 马云开启下半场技术理想
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>
动态调用WCF服务
查看>>