洛谷P3143

P3143 [USACO16OPEN] Diamond Collector S

注释掉的代码的问题是第一次贪心求最大区间可能会覆盖掉真正最优,ans1虽然取了最大值,但ans2+ans1才是我们需要的值,所以只能70%

点击查看代码
#include<bits/stdc++.h>
using namespace std;


int main() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) cin >> a[i];

    sort(a.begin(), a.end());

    vector<int> left(n), right(n);
    int l = 0;
    for (int r = 0; r < n; ++r) {
        while (a[r] - a[l] > k) l++;
        left[r] = max((r > 0 ? left[r - 1] : 0), r - l + 1);
    }

    int r = n - 1;
    for (int i = n - 1; i >= 0; --i) {
        while (a[r] - a[i] > k) r--;
        right[i] = max((i < n - 1 ? right[i + 1] : 0), r - i + 1);
    }

    int ans = 0;
    for (int i = 0; i < n - 1; ++i) {
        ans = max(ans, left[i] + right[i + 1]);
    }

    cout << ans << '\n';
    return 0;
}

// int main() {
//     int n, k; cin >> n >> k;
//     vector<int> a(n);
//     int ans, ans1 = 0, ans2 = 0;
//     for(int i = 0; i < n; i++) {
//         cin >> a[i];
//     }
//     sort(a.begin(), a.end());
//     int l = 0, r = 0;
//     int ml, mr;
//     while(l <= r) {
//         while(a[r] - a[l] <= k && r < n) {
//             r++;
//         }
//         if(r - l >= ans1){
//             mr = r;
//             ml = l;
//             ans1 = max(ans1, r - l);
//         }
//         l++;
//     }
//     for(int i = ml; i < mr; i++) a[i] = 1e9 + 10;
//     sort(a.begin(), a.end());
//     l = 0;
//     r = 0;
//     while(l <= r) {
//         while(a[r] - a[l] <= k && r < n - ans1) {
//             r++;
//         }
//         ans2 = max(ans2, r - l);
//         l++;
//     }
//     ans = ans1 + ans2;
//     cout << ans << '\n';
//     return 0;
// }
posted @ 2025-05-13 09:33  Chuan81  阅读(7)  评论(0)    收藏  举报