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