zoukankan      html  css  js  c++  java
  • HDU1214圆桌会议

    一个环,从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;
    	}
    }
    
  • 相关阅读:
    接口测试第一天:使用requests依赖库发送http请求
    接口测试第一天:使用unittest作为集成测试框架
    python_basic
    观看《黑客帝国》有感
    采集数据注意事项
    操作系统_第二章_进程与线程
    第一章_操作系统概论
    感言&2
    计算机信息安全技术_课后习题总结
    预处理
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12575679.html
Copyright © 2011-2022 走看看