HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有解决不了的问题,这也只有HDU ACM集训队特有的圆桌会议,有一天你也可以进来体会一下哦:),在一天在讨论的时候,Eddy想出了一个极为古怪的想法,如果他们在每一分钟内,一对相邻的两个ACM队员交换一下位子,那么要多少时间才能得到与原始状态相反的座位顺序呢?(即对于每个队员,原先在他左面的队员后来在他右面,原先在他右面的队员在他左面),这当然难不倒其他的聪明的其他队友们,马上就把这个古怪的问题给解决了,你知道是怎么解决的吗?
Input
对于给定数目N(1<=N<=32767),表示有N个人,求要多少时间才能得到与原始状态相反的座位顺序(reverse)即对于每个人,原先在他左面的人后来在他右面,原先在他右面的人在他左面。
Output
对每个数据输出一行,表示需要的时间(以分钟为单位)
Sample
| Inputcopy | Outputcopy |
|---|---|
4 5 6 |
2 4 6 |
哈哈哈哈,我竟然做出来了, 不容易啊, 打字太抽象, 直接手写了,字体一般凑活看看嘿嘿

反正就是注意区分偶数和奇数, 反正他俩不一样, 然后记得特判啦!
#include <iostream>
using namespace std;
const int N = 32767;
typedef long long int ll;
int q[N];
int main() {
q[2] = 1;
q[3] = 3;
for (int i = 4; i <= N; ++i) {
q[i] = q[i - 1] + i - 1;
}
int n;
while (cin >> n) {
if (n == 3) {
cout << 2 << endl;
}
if (n == 1) {
cout << 0 << endl;
}
if (n == 2) cout << 1 << endl;
if (n % 2) {
ll res = 0;
int h = n / 2;
res += 2 * (h - 1);
res ++; // 奇数底部交换
res += q[h - 1] + q[h];
cout <<res << endl;
} else {
int h = n / 2;
ll res = 0;
res += n - 2;
res += q[h - 1] * 2;
cout << res << endl;
}
}
return 0;
}
最后, 祝各位安好, 愿acm之路顺利!!
这篇博客介绍了ACM集训队中关于圆桌座位交换的问题,当队员们每分钟相邻两人交换位置时,探讨了需要多少时间才能达到原始座位顺序的反转。博主给出了对于不同人数(特别是偶数和奇数)的解决方案,并分享了代码实现,重点在于区分奇偶数情况和特判。最后,博主鼓励读者尝试解决此类问题,提升算法思维。

171

被折叠的 条评论
为什么被折叠?



