您的位置:首页 > 其它

zoj 1730 / poj 1455 Crazy Tea Party

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

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

后来才知道,题目意思是,一个环形序列,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: