zoj 1730 / poj 1455 Crazy Tea Party

本文探讨了一种针对环形序列进行逆序操作的高效算法。通过对非环形序列逆序算法的理解,推导出环形序列逆序的最优解,并提供了一个简洁的C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这阵子都没怎么写代码,由于开学,忙于各种琐碎的事情,现在静下来了开始跟着暑假的节奏刷题了。

        这道题一开是没看清题目~在寝室刷题就是效率不高。。。

        后来才知道,题目意思是,一个环形序列,1minute可以交换相邻的两个位置,问逆序所需的最小时间是多少。

        如果不是环形的话那就好办了,就是个冒泡。

        非环形时:

               如 n = 5 : 1 2 3 4 5

               所需时间为:n*(n-1)/2 = 10

        环形时:

               如 n = 5 :1 2 3 4 5

               可将 n拆分成2 + 3

                       1 2 和 3 4 5

               可用4部将其逆序

                        1:2 1 和 3 4 5

                        2:2 1 和 4 3 5

                        3:2 1 和 4 5 3

                        4:2 1 和 5 4 3

                由于其为环形,故至此完成逆序操作      

         所以这题就变得十分简单了,time =    n/2*(n/2 - 1)/2 + (n+1)/2* ((n+1)/2 - 1)/2 

       

#include<iostream>
using namespace std;
int main(void)
{
    int n,ncases;
    cin>>ncases;
    while(ncases--)
    {
	cin>>n;
	cout<<(n/2*(n/2-1)/2+(n+1)/2*((n+1)/2-1)/2)<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值