P1798 求解区间覆盖问题
通过数 169 | 提交数 306 |
时间限制 1s | 空间限制 64MB |
10组 | 来源 Leverage |
评测方式 全文比较(忽略行末空格和文末回车) |
问题描述
用 ii 来表示 xx 坐标轴上坐标为 (i-1,i)(i−1,i)、长度为 11 的区间,并给出 n (1\le n \le 200)n(1≤n≤200) 个不同的整数,表示 nn 个这样的区间。现在要求画 mm 条线段覆盖住所有的区间,条件是每条线段可以任意长,但是要求所画线段的长度之和最小,并且线段的数目不超过 m(l \le m \le 50)m(l≤m≤50)。
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; }
动态规划