P1798 求解区间覆盖问题

 通过数 169  提交数 306
 时间限制 1s  空间限制 64MB
 10组  来源 Leverage
 评测方式 全文比较(忽略行末空格和文末回车)
 

问题描述

用 ii 来表示 xx 坐标轴上坐标为 (i-1,i)(i1,i)、长度为 11 的区间,并给出 n (1\le n \le 200)n(1n200) 个不同的整数,表示 nn 个这样的区间。现在要求画 mm 条线段覆盖住所有的区间,条件是每条线段可以任意长,但是要求所画线段的长度之和最小,并且线段的数目不超过 m(l \le m \le 50)m(lm50)

Tip: 本题为单组输入

输入描述

第 1 行表示区间个数 nn 和所需线段数 mm, 第 2 行表示 nn 个点的坐标。

输出描述

一行,输出 mm 条线段的最小长度和。

样例输入

Copy to Clipboard
5 3
1 3 8 5 11

样例输出

Copy to Clipboard
7

#include<iostream>
#include<algorithm>
#define INF 100000000
using namespace std;
int n,m;
int main(){
    cin>>n>>m;
    int mincost[n],a[n+1],dp[n+1];
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=2;i<=n;i++)
    mincost[i-1]=a[i]-a[i-1]-1;
//    cout<<"mincost:";
    //for(int i=1;i<=n;i++)
//    cout<<mincost[i]<<" ";
//    cout<<endl;
    sort(mincost+1,mincost+n);
    for(int i=1;i<=n;i++){
        if(i<=m)
        dp[i]=i;
        else
        {
            dp[i]=dp[i-1]+mincost[1]+1;
            mincost[1]=INF;
            sort(mincost+1,mincost+n);
        }
    }
    //cout<<"dp:";
//    for(int i=1;i<=n;i++)
    //cout<<dp[i]<<" ";
    //cout<<endl;
    cout<<dp[n];
    return 0;
} 

动态规划

posted @ 2022-06-08 16:05  辛夸高岭桂  阅读(65)  评论(0)    收藏  举报