想法很簡單,就是將 sort 好的位置與原位置相減取絕對值

相加後即為最短距離

但要注意使用的 sort 必須 stable ,也就是 selection sort 、heap sort 和 quick sort 不行

因此如果使用內建的 sort 函數會出問題 

因為我懶的寫 merge sort 所以效率比較差 ( 我使用 bubble sort ) 

 

#include <iostream>
#include <cmath>

using namespace std;

constexpr int MAX_STATUS_NUM = 10000;

struct status{
    int id;
    int height;
    int weight;
};

bool cmp(const status &_a, const status &_b)
{
    return _a.height < _b.height || ((_a.height == _b.height) && (_a.weight <= _b.weight));
}


int main()
{
    int status_num;
    while(cin >> status_num){
        status st[MAX_STATUS_NUM];
        for(int i = 0; i<status_num; i+=1){
            cin >> st[i].height >> st[i].weight;
            st[i].id = i;
        }

        for(int i = 0; i<status_num; i+=1){
            for(int j = 0; j<status_num-i-1; j+=1){
                if(!cmp(st[j], st[j+1]))
                    swap(st[j], st[j+1]);
            }
        }

        int sum = 0;
        for(int i = 0; i<status_num; i+=1){
            sum += abs(st[i].id - i);
        }

        cout << sum << endl;
    }

    return 0;
}

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()