SDUT_區間覆蓋問題_貪心

區間覆蓋問題

Time Limit: 1000 ms Memory Limit: 65536 KiB

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個最大的兩個區間的距離。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章