洛谷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;
// }

浙公网安备 33010602011771号