区间覆盖问题

来源:互联网 发布:a卡表面格式优化 编辑:程序博客网 时间:2024/06/09 01:04

Problem Description

用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。
现在要求画m条线段覆盖住所有的区间,
条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,
并且线段的数目不超过m(1≤m≤50)。

Input

输入包括多组数据,每组数据的第一行表示点n,和所需线段数m,后面的n行表示点的坐标

Output

输出每组输出占一行表示线段的长度。

Example Input

5 31 3 8 5 11

Example Output

7
 

#include<stdio.h>#include<string.h>void sort (int * p ,int n){    int i,j;    int tmp;    for(i=1;i<=n;i++)    {        for(j=1;j<=n-i;j++)        {            if(p[j]<p[j+1])            {                tmp=p[j];                p[j]=p[j+1];                p[j+1]=tmp;            }        }    }}int main(){    int n,m;    int position[201]={0};    int distance[201]={0};    int i,j;    int count=0;    int length;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(position,0,sizeof(position));        memset(distance,0,sizeof(distance));        for(i=1;i<=n;i++)        {            scanf("%d",&position[i]);        }        sort(position,n);

        for(i=1;i<n;i++)        {            distance[i]=position[i]-position[i+1]-1;        }        sort(distance,n);

        if(n<=m)            printf("%d\n",n);        else        {            length=position[1]-position[n]+1;            for(count=1;count!=m;count++)            {                length -= distance[count];            }            printf("%d\n",length);        }    }    return 0;}

0 0
原创粉丝点击