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;
    	}
    }
    
  • 相关阅读:
    MAVLINK协议
    rtt之通用bootloader
    easy flash &easy log
    电源适配器DC插头规格
    Jquery实现仿腾讯微薄的广播发表
    可供前端工程师选择的精彩CSS框架
    javascript实现记录文本框内文字个数
    Jquery仿IGoogle实现可拖动窗口(源码)
    jquery javascript 回到顶部功能
    常用的经典jquery代码[转]
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12575679.html
Copyright © 2011-2022 走看看