区间覆盖问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤M≤200)个不同的整数,表示n个这样的区间。
现在要求画m条线段覆盖住所有的区间,
条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,
并且线段的数目不超过N(1≤N≤50)。
输入
输入包括多组数据,每组数据的第一行表示点n,和所需线段数m,后面的n行表示点的坐标
输出
输出每组输出占一行表示线段的长度。
示例输入
5 3 1 3 5 8 11
示例输出
7
本题主要运用贪心思想
#include <stdio.h> void qsort(int *a,int star,int fin)//快排函数降序排列 { int key=a[star],i=star,j=fin; if(star>=fin) return; while(i<j) { if(i<j&&a[j]<=key) j--; a[i]=a[j]; if(i<j&&a[i]>=key) i++; a[j]=a[i]; } a[i]=key; qsort(a,star,i-1); qsort(a,i+1,fin); } int main() { int n,m,i,j; int da[210],dis[200]; while(~scanf("%d %d",&n,&m)) { for(i=0;i<n;i++) scanf("%d",&da[i]);//输入n个区间 qsort(da,0,n-1); for(i=0;i<n-1;i++) dis[i]=da[i]-da[i+1]-1;//计算邻接区间的距离 qsort(dis,0,n-2); int num=1;//当前所用的线段个数 int total=da[0]-da[n-1]+1;//当前所用的线段总长 j=0;//当前最大的未断开的区间距离 while(num<m&&dis[devide]>0) { num++; total-=dis[j];//当前的总长 j++; } printf("%d\n",total); } return 0; }