zoukankan      html  css  js  c++  java
  • 题解 LA2756

    题目大意 (n) 组数据,每组数据给定一个整数 (m)。求出最少的交换次数,使得围成一圈的 (m) 个人的左右两人交换(比如 1->2->3->1 变成 3->2->1->3),且每次只交换相邻的两个人。

    分析 我们先来证明一个引理。

    引理 将圆圈翻转的最优过程一定可以被划分为两个部分,使得两序列中各自被翻转。

    引理

    证明 (m=1) 时显然成立。假定对 (m) 成立,考虑 (m+1) 的情况。由于对于 (m) 成立,所以考虑第 (m+1) 个点不动。此时其它 (m) 个点已排好,而 (m+1) 需要绕到对面去,这就说明它要么与左边的在一起构成一个翻转序列,要么和右面的一起。假如第 (m+1) 个点动了,这不会影响其余点的顺序。由于最优,则该点要么一直往左走到对面,要么一直往右走到对面,等价于与左边或右边构成一个翻转序列。由数学归纳法,原命题成立。

    而对于一个长度为 (L) 的翻转序列,其交换次数为 (frac{L(L-1)}{2}),所以简单计算可得,将圆圈尽量划分为长度相等的两部分是最优的。

    #include<bits/stdc++.h>
    using namespace std;
    
    int n, x;
    
    int f(int x)
    {
    	return x * (x - 1) / 2;
    }
    
    int main()
    {
    	scanf("%d", &n);
    	while(n--) {
    		scanf("%d", &x);
    		printf("%d
    ", f(x / 2) + f((x + 1) / 2));
    	}
    }
    
  • 相关阅读:
    [转]测试的基本概念
    记录
    flash 与 程序通讯
    怎么正确的建立项目
    安装包的制作
    JS
    页面刷新定位
    [转]C#处理XML
    MSN机器人
    报表 的使用
  • 原文地址:https://www.cnblogs.com/whx1003/p/12110056.html
Copyright © 2011-2022 走看看