圆桌会议 HDU - 1214

这篇博客介绍了ACM集训队中关于圆桌座位交换的问题,当队员们每分钟相邻两人交换位置时,探讨了需要多少时间才能达到原始座位顺序的反转。博主给出了对于不同人数(特别是偶数和奇数)的解决方案,并分享了代码实现,重点在于区分奇偶数情况和特判。最后,博主鼓励读者尝试解决此类问题,提升算法思维。

HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有解决不了的问题,这也只有HDU ACM集训队特有的圆桌会议,有一天你也可以进来体会一下哦:),在一天在讨论的时候,Eddy想出了一个极为古怪的想法,如果他们在每一分钟内,一对相邻的两个ACM队员交换一下位子,那么要多少时间才能得到与原始状态相反的座位顺序呢?(即对于每个队员,原先在他左面的队员后来在他右面,原先在他右面的队员在他左面),这当然难不倒其他的聪明的其他队友们,马上就把这个古怪的问题给解决了,你知道是怎么解决的吗?

Input

对于给定数目N(1<=N<=32767),表示有N个人,求要多少时间才能得到与原始状态相反的座位顺序(reverse)即对于每个人,原先在他左面的人后来在他右面,原先在他右面的人在他左面。

Output

对每个数据输出一行,表示需要的时间(以分钟为单位)

Sample

InputcopyOutputcopy
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之路顺利!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值