题目大意:
K.Bro自己发明了一种排序方式,在序列中随机选择一个数,如果后面的数小于它,则交换位置,直到不能交换为止,为最少的交换次数;
题目分析:
先说我看到以为大牛的做法吧:
我觉得这才是比较标准的做法,树状数组或者线段树,每次移动最大数字,那它位置后的数字都前移一位。最后统计移动次数;
(我自己的,待补充吧)
大神博客传送门:点击打开链接 // (hdu 5122)
不过有种投机取巧的方法,试着想一下,从后往前比,如果是逆序则交换,统计交换次数,最后的结果也是最小的;
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1000010];
int main()
{
int T;
int cas = 0;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
}
int ans = 0;
for(int i = n-2; i >= 0; --i){
if(a[i] > a[i+1]){
swap(a[i], a[i+1]);
ans++;
}
}
printf("Case #%d: %d\n", ++cas, ans);
}
}