【题解】约瑟夫问题2
【题目描述】
M个人围成一圈,每分钟相邻的两个人可以交换位置(只能有一对交换)。求使M个人的顺序颠倒(即每个人左边相邻的人换到右边,右边相邻的人换到左边)所需的最少时间(分钟数)。
【输入描述】
第一行为测试数据的组数n,以后n行中每行为一个小于32767的正整数,表示M
【输出描述】
对于每组测试数据,输出一个数,表示最少需要的分钟数。
【样例输入】
3 4 5 6
【样例输出】
2 4 6
【题目分析】
此题属于找规律题,规律推导过程如下:
首先一个人不需要交换,至少两个人
必须相邻的人交换
只有两个人时,颠倒两个人只需要一次
有三个人时,答案是2
当有四个人时, 这样是需要交换3次。
但是实际上来说,还有更次数更少的交换方式,比如下面这样:
这样的话,我们只需要移动两次就可以了。
同理,继续找规律,
人数 需要交换的次数 2 1 3 2 4 2 5 4 6 6 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({});