区间覆盖问题
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
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 3
1 3 8 5 11
Example Output
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
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 3
1 3 8 5 11
Example Output
7
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int m,n;
int position[2100],distance[5500];
while(~scanf("%d %d",&m,&n))
{
memset(position,0,sizeof(position));
memset(distance,0,sizeof(distance));
for(int i = 0; i < m; i++)
scanf("%d",&position[i]);
if(n>=m)
{
printf("%d\n",m);
continue;
}
sort(position,position+m,cmp);
for(int i = 0; i < m-1; i++)
distance[i] = position[i]-position[i+1]-1;
sort(distance,distance+m-1,cmp);
int line = 1;
int devide = 0;
int totaldistance = position[0]-position[m-1]+1;
while(line<n)
{
if(distance[devide]>0)
{
line++;
totaldistance-=distance[devide];
devide++;
}
}
printf("%d\n",totaldistance);
}
return 0;
}
#include<stdio.h> #include<algorithm> using namespace std; int s[205],t[205]; int main() { int n,m,i,l; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&s[i]); } sort(s,s+n); for(i=0;i<n-1;i++) { t[i]=s[i+1]-s[i]-1; } sort(t,t+n-1); l=0; for(i=n-2;i>n-m-1;i--) { l+=t[i]; } printf("%d\n",s[n-1]-s[0]+1-l); } return 0; }