感觉自己写的没什么问题,但是只有30pts分,其余点都WA
查看原帖
感觉自己写的没什么问题,但是只有30pts分,其余点都WA
1026350
Suboil楼主2023/7/30 16:38

思路

大体思路很简单,相当于是每一次找最小的两个堆进行相加,但是如果直接使用sort排序的话有50分都超时了,于是我对其进行优化,去找符合相加后堆的位置,并且将该位置前的所有位置前移

提示

注释部分解开可以明确的看到每一步

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
int n;ll sum = 0;
ll a[10010];
int main(){
    cin >> n;
    for(int i = 1;i <= n;i++) cin >> a[i];
    a[n + 1] = 999999;
    sort(a + 1,a + 1 + n);
    int de = 1;
    for(int i = 2;i <= n;i++) {
        de++;
        int t = a[i] + a[i - 1],k = 0;

        sum += t;
        for(int j = i + 1;j <= n;j++) {
            if(t >= a[j] && t <= a[j + 1]) {
                k = j;
                break;
            }
        }
        
        if(k) {
            for(int j = de;j < k;j++) a[j] = a[j + 1];
            a[k] = t;
        }else a[i] = t;

        // for(int i = de;i <= n;i++) {
        //     cout << a[i] << " ";
        // }

        // cout << endl;
        
    }

    cout << sum << endl;

    return 0;
}
2023/7/30 16:38
加载中...