Year of the Cow (USACO Silver 2021 February)

Year of the Cow (USACO Silver 2021 February)

题意就是找到总长度最短的K1K-1段区间,起点终点都是1212的倍数,覆盖所有NN个数字(a[i]<109a[i] < 10^9),N65536N \leq 65536.

要想让区间总长最短,就是让中间的间隔总长最大,所以就是挑K1K-1个最大的gap。稍微需要注意的两点:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
int n, k;
int a[66000];
vector<int> gaps;
 
int C(int x) {
    return (x + 11) / 12 * 12;
}
int F(int x) {
    return x / 12 * 12;
}
 
int main() {
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    sort(a, a + n);
    for (int i = 0; i < n - 1; i++) {
        int r = F(a[i+1]);
        int l = C(a[i]);
        if (r > l) gaps.push_back(r - l);
    }
    gaps.push_back(F(a[0]));
    sort(gaps.begin(), gaps.end(), greater<int>());
    int ans = C(a[n-1]);
    for (int i = 0; i < k - 1; i++)
        ans -= gaps[i];
    printf("%d\n", ans);
 
    return 0;
}