UVA-10570 Meeting with Aliens (枚举+贪心)
2015-10-13 10:36
393 查看
题目大意:将一个1~n的环形排列变成升序的,最少需要几次操作?每次操作可以交换任意两个数字。
题目分析:枚举出1的位置。贪心策略:每次操作都保证至少一个数字交换到正确位置上。
题目分析:枚举出1的位置。贪心策略:每次操作都保证至少一个数字交换到正确位置上。
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; int a[2000],head,tail,n,b[505]; bool ok(int id,int d) { for(int i=0;i<n;++i){ int p=(id+d*b[i]-d+n)%n; if(p!=i) return false; } return true; } int getAns(int id,int d) { for(int i=0;i<n;++i) b[i]=a[i]; int res=0; while(!ok(id,d)) { for(int i=0;i<n;++i){ int p=(id+d*b[i]-d+n)%n; if(i!=p){ ++res; swap(b[i],b[p]); } } } return res; } void solve() { head=0,tail=n; while(a[head]!=1) a[tail++]=a[head++]; for(int i=0;i<n;++i) a[i]=a[head++]; int ans=100000000; for(int i=0;i<n;++i) ans=min(ans,min(getAns(i,1),getAns(i,-1))); printf("%d\n",ans); } void read() { for(int i=0;i<n;++i) scanf("%d",a+i); } int main() { ///freopen("UVA-10570 Meeting with Aliens.txt","r",stdin); while(scanf("%d",&n)&&n) { read(); solve(); } return 0; }
相关文章推荐
- C#中web获取路径
- Unity CS
- linux文件实时同步
- git删除远程分支
- mysqldump备份与还原数据操作
- jquery操作复选框(checkbox)的12个小技巧总结
- 启动程序广播接收器LaunchAppReceiver
- 批处理之删除或备份指定天数之前的文件
- [转]c中按位分配int的方法
- css 伪类::after ::beftor 的使用方式
- MySQL数据的主从复制、半同步复制和主主复制详解-转
- windows 编程
- ASP.NET购物车实现过程详解
- 如何用简单易懂的例子解释隐马尔可夫模型?
- 浅析NSNetService和NSNetServiceBrowser
- c++实现加锁解锁
- Linux下创建管理员权限用户
- URI工具箱:获得电话和短信Uri
- linux环境下Markdown编辑器汇总
- Warning: Null value is eliminated by an aggregate or other SET operation.