區間覆蓋問題
Problem Description
用i來表示x座標軸上座標爲[i-1,i]的長度爲1的區間,並給出n(1≤n≤200)個不同的整數,表示n個這樣的區間。
現在要求畫m條線段覆蓋住所有的區間,
條件是:每條線段可以任意長,但是要求所畫線段的長度之和最小,
並且線段的數目不超過m(1≤m≤50)。
Input
輸入包括多組數據,每組數據的第一行表示區間個數n和所需線段數m,第二行表示n個點的座標。
Output
每組輸出佔一行,輸出m條線段的最小長度和。
Sample Input
5 3 1 3 8 5 11
Sample Output
7
Hint
Source
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
return x>y;
}
int main(){
int n,m,sum;
int a[210],dist[210]; //保存座標和間距
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n-1;i++){
dist[i]=a[i+1]-a[i]-1;
}
sort(dist,dist+(n-1),cmp);//間距由大到小排列
sum=a[n-1]-a[0]+1;
for(int i=0;i<m-1;i++){ //總距離減去m-1個最大的間距
sum-=dist[i];
}
printf("%d\n",sum);
}
return 0;
}
//思路:只要將最長長度求出來,然後求出每兩個區間距離,
//最後用sum減去m-1個最大的兩個區間的距離。