Codeforces - 1110B. Tape 贪心 + 排序
题目
给你一根木棍,包含 m
段,每段 1cm
(总长度 m cm
),现在有 n
个段(洞) 需要修复,你有 k
个 pieces
,问你修复这 n
个段需要的最小长度的 pieces
。
解析
很好的贪心题:
- 假设先用最长的一段
piece
来修复整个stick
,耗费m
长度; - 然后将最大的
k-1
个那些间隔(用d
数组统计间距) 挖去,这样就划分成了k
个部分; - 注意在挖去的时候减去的距离是
d[i] - 1
而不是d[i]
,自己带入一个实例就清楚了;
代码:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(new BufferedInputStream(System.in));
PrintStream out = System.out;
int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
int[] arr = new int[n];
int[] d = new int[n];
for(int i = 0; i < n; i++){
arr[i] = in.nextInt(); // arr is sorted
if(i != 0) d[i] = arr[i] - arr[i-1];
}
Arrays.sort(d);
long res = arr[n-1] - arr[0] + 1; // max answer
// 挖 k - 1 个最大的间隔
for(int i = n - 1; i > (n - k); i--) // d 数组总长度 1~n-1, 将这些划分成 k 个,所以减去最大的 k-1 段
res -= (d[i]-1);
out.println(res);
}
}
题目链接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论