小米OJ #8【最少交換次數】
阿新 • • 發佈:2018-12-12
描述
給出一個無序數列,每次只能交換相鄰兩個元素,求將原數列變成遞增數列的最少交換次數。 如:數列:2,3,1,交換3和1後變成:2,1,3;交換1和2之後變成:1,2,3。總共交換2次。
輸入
逗號隔開的正整數數列
輸出
正整數
輸入樣例
2,3,1
輸出樣例
2
題解:樹狀陣列求逆序對,直接套模板。輸入是個狗東西。。。
#include <iostream> #include <bits/stdc++.h> using namespace std; const int maxn = 1005; int a[maxn], c[maxn]; int ans = 0, n; int lowbit(int x){ return x & -x; } int get_sum(int x){ int sum = 0; while(x){ sum += c[x]; x -= lowbit(x); } return sum; } void add(int x, int val){ while(x <= n){ c[x] += val; x += lowbit(x); } } int main() { char line[1000000]; char ch; while(cin.getline(line, 1000000)){ n = 0; ans = 0; memset(a, 0, sizeof a); memset(c, 0, sizeof c); int x = 0; char *p = strtok(line, ","); while(p){ sscanf(p, "%d", &x); a[++n] = x; p = strtok(NULL,","); } for(int i = n; i >= 1; i--){ add(a[i], 1); ans += get_sum(a[i]-1); } printf("%d\n", ans); } return 0; }