一个环,从1编号到n。

每次可以交换相邻的两个人,

问最少交换几次,使得每个数字的左右数字交换。

转载自:https://blog.csdn.net/yin_zongming/article/details/13699941

分割线

每一分钟只能有一对,而且这一对必须是相邻的人互换位置,注意理解好题意。

如果不是一个环形的话,想通过对换这种方式来变成逆序,就类似于冒泡排序,那样的话如果有n个人,那么就需要\(n*(n-1)/2\)步;

那么对于一个环形来说,如何才能达到最快的排序方式呢,其实也是类似于上一种,就是把这个环“切”成两条“线段“,当这两条线段排成逆序的同时,这个环也就逆序了。

就例如如果有5个人围在一个圆桌,编号为1~5,那么想要变成逆序。就可以看成1 ,2 两个人和 3, 4, 5三个人这两种情况。1,2变成逆序2,1需要一步,3,4,5变成逆序5,4,3需要三步,这样此时的序列就变成了2,1, 5,4,3 也就达到了目的。

移动的过程是将圆环分为两段,分别移动。那么又在何处分段呢?

答案是尽量使两段长度相等。

为啥?证明如下:

设n为总长度,分为两段,长度分别为a、b。总次数\(=a*(a-1)/2+b*(b-1)/2=a*(a-1)/2+(n-a)*(n-a-1)/2=(2*a^2-2*n*a+n^2)/2\)。

其中n为常量,a为变量。二次曲线开口向上,最小值对应的\(a=-(-2*n)/(2*2)=n/2\)。显然a要求整数。

#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int x=n/2;
int y=n-x;
cout<<(x-1)*x/2+(y-1)*y/2<<endl;
}
}

最新文章

  1. Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)
  2. 【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
  3. sparksql udf的运用----scala及python版(2016年7月17日前完成)
  4. python css基本操作
  5. IOS系列swift语言之课时七
  6. 字符串匹配(KMP算法)
  7. 如何用linux远程登录windows计算机
  8. RM报表的选项 注册表位置
  9. Problems running django-admin
  10. NET Core驱动已出,支持EF Core
  11. Array 的五种迭代方法 -----every() /filter() /forEach() /map() /some()
  12. Makefile分析基础
  13. directX--大约CSource和CSourceStream (谁在叫fillbuffer)
  14. CoreCRM 开发实录 —— 单元测试之 Mock UserManager 和 SignInManager
  15. Threejs 开发3D地图实践总结
  16. 深入学习MySQL事务:ACID特性的实现原理
  17. 根据List集合中的对象属性排序
  18. 网络编程-Python高级语法-深浅拷贝
  19. python程序—用户登录
  20. windows下的mongodb安装与配置

热门文章

  1. 通过bat文件 进行mysql 连接 或者 操作涉及 密码的,如果密码 中有 % 号的话要特殊处理
  2. python操作MySQL数据库报错问题解决
  3. 哈密顿绕行世界问题 HDU2181
  4. D - Three Integers CodeForces - 1311D
  5. redis的安装(ubuntu版本)
  6. python爬虫(1)requests库
  7. thinkphp5 --接口实例
  8. Makefile 中引用多个 include 路径
  9. Windows 计划任务 如果选择未登录就运行 则看不到GUI
  10. union 的概念及在嵌入式编程中的应用