杭电1210

这题是一个找规律题,我还是尊从我自己的想法,我觉得一般的规律题都是有技巧的,就像是数学中的题一样,很多题是要你求一个通解,但是很多人就是用特殊值带入而看出了规律,从而求了出来。这里也是一样的只要你抓住某一个来做就行了。在这里我就简单说说这题的做法为什么是那样的。题意大概是说将2N张排按顺序排好,之后将排在后面的N张依次插入到前面N张,比如说是10张牌1 2 3 4 5 6 7 8 9 10,洗一次之后就是6 1 7 2 8 3 9 4 10 5.洗了两次之后就是3 6 9 1 4 7 10 2 5 8.。。。就是将后面的排顺序插到前面。那么多少次之后就可以到原来的排呢?

下面我们来看看在排成原来的排之前的一次是什么样子。

两张 2 1

四张2 4 1 3 

六张2 4 6 1 3 5

8张2 4 6 8 1 3 5 7

十张2 4 6 8 10 1 3 5 7 9

。。。

。。。。

看到上面规律就很清楚了,就是说在要恢复的前一次有很明确的规律,而且所有的排呈现出来的规律都是一样的,你只要抓住一张牌进行分析就可以了。

比如说2号每次当他到一号位就表示要恢复了,或者是1号每次当他在中间是就要恢复了,这里我们以1号排来说明一下。

用十张牌比方,我们看看如何变化,

1 2 3 4 5 6 7 8 9 10第一次6 1 7 2 8 3 9 4 10 5第二次3 6 9 1 4 7 10 2 5 8.第三次7 3 10 6 2 9 5 1 8 4第四次9 7 5 3 1 10 8 6 4 2第五次10 9 8 7  6 5 4 3 2 1第六次 5 10 4 9 3 8 2 7 1 6第七次8 5 2 10 7 4 1 9 6 3 第八次4 8 1 5 9 2  6 10 3 7第九次2 4 6 8 10 1 3 5 7第十次1 2 3 4  5 6 7 8 9 10.

看着1号第0次在位置1,第一次在位置2,第二次在位置4,第三次在位置8,第四次在位置5,第五次在位置10,第六次。。。。。。

上面的规律看出来了没??当1号的位置小于等于5时,下一次的位置就乘以2(这个自己想为什么),当大于5呢?我们是2*(i-5)-1(想想为什么??)

这个规律找出来就简单多了。下面提供一个AC的代码仅供参考:

#include<iostream>
using namespace std;
int main()
{
  int N;
  int sum,i,j;
  while(cin>>N)
  {
      i=1;
      sum=0;
      while(i!=N+1)
      {
          if(i<=N)
          {
              i*=2;
              sum++;
          }
          else 
          {
              i=2*(i-N)-1;
              sum++;
          }
      }
      sum++;
      cout<<sum<<endl;

  }
  return 0;

}
数据的话大家可以自己用可以AC的代码自己试试看。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值