題目描述
【問題描述】
有n條線段(給出起點和末端),分別坐落在數軸上,要求它們之間彼此不重疊的條件下,最大可以覆蓋數軸的長度。(數軸的長度指線段覆蓋數軸數字的個數)(1~3和3~4的線段視爲重疊)
【輸入】
第一行一個整數n(1<=n<=1000)
第2~n+1行,每行兩個整數start和end,描述線段的起點和末端,所有線段都落在[0,2000]的範圍內。
【輸出文件】
一個整數,表示最多覆蓋數軸的長度。
第一次秒題!。
按起點排序後直接從前面找能轉移過來的狀態。
取max即可。
事實證明手打快排真的不好
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge{
int l,r;
}p[2001];
int n,f[2001];
//void qsort(int x,int y)
//{
// int i=x,j=y,k=l[(i+j)/2];
// while (i<=j)
// {
// while (l[i]<k) i++;
// while (l[j]>k) j--;
// while (i<=j)
// {
// int t;
// t=l[i];l[i]=l[j];l[j]=t;
// t=r[i];r[i]=r[j];r[j]=t;
// i++;j--;
// }
// }
// if (i<y) qsort(i,y);
// if (x<j) qsort(x,j);
//}
int cmp(edge x,edge y)
{
if(x.l==y.l) return x.r<y.r;
return x.l<y.l;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].l,&p[i].r);
}
sort(p+1,p+n+1,cmp);
for (int i=1;i<=n;i++)
f[i]=p[i].r-p[i].l+1;
for (int i=1;i<=n;i++)
for (int j=1;j<=i-1;j++)
{
if (p[j].r<p[i].l) f[i]=max(f[i],f[j]+p[i].r-p[i].l+1);
}
int max1=0;
for (int i=1;i<=n;i++)
max1=max(max1,f[i]);
printf("%d",max1);
return 0;
}