青少年编程知识记录 codecoming

【题解】约瑟夫问题2

【题目描述】

M个人围成一圈,每分钟相邻的两个人可以交换位置(只能有一对交换)。求使M个人的顺序颠倒(即每个人左边相邻的人换到右边,右边相邻的人换到左边)所需的最少时间(分钟数)。

【输入描述】

   第一行为测试数据的组数n,以后n行中每行为一个小于32767的正整数,表示M

【输出描述】

对于每组测试数据,输出一个数,表示最少需要的分钟数。

【样例输入】

3  4  5  6

【样例输出】

2  4  6

最原始的约瑟夫问题请点击这里 



【题目分析】

    此题属于找规律题,规律推导过程如下:

  • 首先一个人不需要交换,至少两个人

  • 必须相邻的人交换

  • 只有两个人时,颠倒两个人只需要一次

  • 有三个人时,答案是2



  • 当有四个人时, 这样是需要交换3次。

    但是实际上来说,还有更次数更少的交换方式,比如下面这样: 



    这样的话,我们只需要移动两次就可以了。

  • 同理,继续找规律,



  • 人数需要交换的次数
    21
    32
    42
    54
    66
    7

    9

【参考答案】

#include<bits/stdc++.h>  using namespace std;    int main()  {      int x,n;      cin>>n;      while(n--)      {          cin>>x;          if(x%2==0)          {              cout<<(x/2)*(x/2-1)<<endl;          }          else          cout<<(x-1)*(x-1)/4<<endl;      }   }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:题解目录 浏览: