题目大意

​ 给定一个长度为 nn 的序列 cc 去重后,用 kk 个区间完全覆盖这个序列,问 kk 个区间长度和的 最小值 为多少

分析

​ 先对序列 cc 去重,对序列 cc 做差分

​ 得到差分数组 dd

​ 观察到

​ 当 k=1k = 1res=dres = \sum d

​ 当 k>1k > 1, 每划出一个区间相当于答案减去 $ d_i$ ,故为使 resres 最小从大到小减去 did_i 即可

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int n,k;

signed main()
{
cin >> n >> k;
vector<int> a;
for(int i = 0;i < n;i++){
int x;cin>>x;
a.push_back(x);
}
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end());
vector<int> b;
for(int i = 1; i < a.size();i++)
b.emplace_back(a[i] - a[i-1]);
sort(b.begin(),b.end(),greater<int>());
int res = 0;
for(auto k:b) res += k;

for(int i = 2;i <= k;i++){
res -= b[i-2];
}
cout << res << endl;

return 0;
}