2 条题解
-
1
对于每对 ,可以看成一个区间 ,问让所有的 至少属于一个 ,求。
对于每个相邻的 到 ,如果它们被分到了不同的区间里,那么这两个区间之间就不需要覆盖这段空隙,相当于从总长度里省掉了
所以问题就变成了:排序后,把 个点分成至多 段,每段用一个区间覆盖,代价是这一段的最大值减最小值。要最小化总代价。
先把 从小到大排序。现在有 个区间,相当于把序列切成 段。每切一刀,就会少覆盖一个相邻空隙。
总代价可以写成:
我们要让总代价最小,也就是要让被切掉的相邻空隙之和最大。因为最多切成 段,所以最多只能切 刀。于是贪心地选最大的 个相邻空隙切掉即可。
所以最终答案:
$$ans=(c_n-c_1)-\sum_{i=1}^{k-1} \text{第 } i \text{ 大的相邻差}$$如果 ,每个点都可以单独用一个长度为 的区间覆盖,答案就是 。
if(k>=n){puts("0");return 0;} sort(c+1,c+1+n); for(int i=1;i<n;i++) l[i]=c[i+1]-c[i]; sort(l+1,l+1+n,cmp); long long ans=c[n]-c[1]; for(int i=1;i<=k-1;i++) ans-=l[i]; cout<<ans;这里 就是相邻两个点之间的距离,排序后,前 个就是最大的 个空隙。 注意答案要用
long long,因为 可以到 ,总长度可能到 级别。
信息
- ID
- 2766
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 16
- 已通过
- 11
- 上传者