题目链接
把N分成差最小的两个部分,即偶数分为N/2和N/2,奇数分为N/2和N/2+1,然后每个部分内部用相邻两个数交换的方法计算所需要的步骤。
附上AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<set>
#include<vector>
#include<map>
#include<string>
#include<cmath>
#define pq priority_queue
#define Pi acos(-1.0)
#define MAXX 1000000007
using namespace std;
long long ans[66666];
int go(int x)
{
return x*(x+1)/2-x;
}
int main()
{
ans[1]=0;
int x;
for(int i=1;i<32768;i++)
{
ans[i]=go(i/2)+go(i-i/2);
}
int t;
cin>>t;
while(t--)
{
cin>>x;
cout<<ans[x]<<endl;
}
return 0;
}
Memory: 0 KB Time: 3 MS
Language: C++ 4.8.2 Result: Accepted