算法设计与分析 2.1 杰哥和序列

算法设计与分析 2.1 杰哥和序列_第1张图片

 解法:

先弄懂逆序对的含义,其实最重要的一点就是,逆序对的数量就是要交换相邻达到非递减的最小交换次数,也就是说每交换一次,逆序对就会少一对。

因此本题其实根本不是贪心算法或者动态规划,就是求出所有的逆序对数量,然后看是交换代价小还是训话代价小,要么全部交换,要么全部训话。

#include
#include
#include

using namespace std;
const int N = 100000;

int a[N], tmp[N];
int ans;

void Merge(int l, int m, int r) {
    int i = l;
    int j = m + 1;
    int k = l;
    while (i <= m && j <= r) {
        if (a[i] > a[j]) {
            tmp[k++] = a[j++];
            ans += m - i + 1;
        }
        else {
            tmp[k++] = a[i++];
        }
    }
    while (i <= m)
        tmp[k++] = a[i++];
    while (j <= r)
        tmp[k++] = a[j++];
    for (int i = l; i <= r; i++)
        a[i] = tmp[i];
}

void Merge_sort(int l, int r) {
    if (l < r) {
        int m = (l + r) >> 1;
        Merge_sort(l, m);
        Merge_sort(m + 1, r);
        Merge(l, m, r);
    }
}

int main() {
    int n, A, B;
    cin >> n >> A >> B;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    ans = 0;
    Merge_sort(0, n - 1);
    if (A < B) ans = ans * A;
    else ans = ans * B;
    cout << ans << endl;
    return 0;
}
最后得分是8分。分析了原因是最后两个点数据大,溢出了。

改进思路:

把所有的int型,改成long型,解决溢出问题,10分。

 

你可能感兴趣的:(算法设计与分析 2.1 杰哥和序列)