Year of the Cow (USACO Silver 2021 February)
题意就是找到总长度最短的段区间,起点终点都是的倍数,覆盖所有个数字(),.
要想让区间总长最短,就是让中间的间隔总长最大,所以就是挑个最大的gap。稍微需要注意的两点:
- 整数ceil/floor要写对
- 最小的年份下面也是一个gap,FJ如果选择这个,就代表最后time travel回到现在,如果不选,就代表最后不time travel,而是等到回到现代。
#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;
}