104人阅读 评论(0)

# Sort it

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3510    Accepted Submission(s): 2546

Problem Description
You want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it need.
For example, 1 2 3 5 4, we only need one operation : swap 5 and 4.

Input
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 1000); the next line contains a permutation of the n integers from 1 to n.

Output
For each case, output the minimum times need to sort it in ascending order on a single line.

Sample Input
3
1 2 3
4
4 3 2 1 

Sample Output
0
6//虽然是水题，但是对于初学者来说很想通，自己好好推理推理#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1010;
int C[maxn],n;
int lowbit(int x)
{
return x&(-x);
}
void update(int i)
{
while(i<=n)
{
C[i]+=1;
i+=lowbit(i);
}
}
int query(int i)
{
int sum=0;
while(i>0)
{
sum+=C[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
while(cin>>n)
{
int sum=0;
memset(C,0,sizeof(C));
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
update(a);
sum+=i-query(a);//得出比i大的的元素个数，即要交换的次数
}
cout<<sum<<endl;
}
return 0;
}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：8719次
• 积分：668
• 等级：
• 排名：千里之外
• 原创：59篇
• 转载：9篇
• 译文：0篇
• 评论：1条
评论排行
最新评论