【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代码就不贴了。。

转载于:https://www.cnblogs.com/g-word/p/3387117.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值