zoukankan      html  css  js  c++  java
  • 【noip2005】篝火晚会

    题解:

    首先我们要知道一个性质:

    把长度为n的序列变成目标序列最多需要n个操作

    证明1:

    我们可以将原序列上每位上的数字向目标序列相同位置的数字连一条有向边

    如:

    原序列:   1 2 3

    目标序列:3 1 2

    则 1指向3、2指向1、3指向2

    显然这样连完后 构成的图为若干个环

    我们只要将非自环(原序列和目标序列上的数一样)的环拿出来做操作即可

    这样显然我们需要花费 n-原序列和目标序列相同的个数 个操作

    所以我们需要构造目标序列使得原序列和目标序列相同的个数最多

    因为每个人左右是谁都已确定 所以我们对目标序列只能做翻转、平移

    先不考虑翻转

    我们需要再知道一个性质:

    假设差值为 (原序列-目标序列+n)%n

    如:

    原序列:   1 2 3

    目标序列:3 1 2

    差值:      1 1 1

    对于差值相同的数 不论怎么平移 差值永远相同

    证明2:

    由于原序列是一个等差数列 所以在直角坐标系上是一条直线

    而差值相同的数 在直角坐标系上则必是与 原序列平行的一条直线

    显然平行直线不论怎么平移永远平行

    这样我们就可以先随便构造一个目标序列

    n-差值相同的最多的个数 即为答案(翻转再做一次 取max)

    这题没打代码 只是觉得有点神奇 所以写下题解 - - so代码就不贴了。。

  • 相关阅读:
    CSS Grid网格布局全攻略
    正则表达式不要背
    前端模块化的前世今生
    关于React Hooks,你不得不知的事
    精简版LINUX系统---wdOS
    TypeScript_泛型
    typescript_类
    ES5_对象 与 继承
    TypeScript_基础数据类型
    vue-route+webpack部署单页路由项目,访问刷新出现404问题
  • 原文地址:https://www.cnblogs.com/g-word/p/3387117.html
Copyright © 2011-2022 走看看