這陣子都沒怎麼寫代碼,由於開學,忙於各種瑣碎的事情,現在靜下來了開始跟著暑假的節奏刷題了。 這道題一開是沒看清題目~在寢室刷題就是效率不高。。。 後來才知道,題目意思是,一個環形序列,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;