小明提供 B个区间的清单。一个区间是一对整数 start和 end,表示一些连续的食堂窗口,比如 1 -3 等等。小明可以任意选择区间,但是他选择的区间不能有重叠。
求最多的窗口数
数据范围:B<=1000
思路:先排序,设f[i]为前i个区间中,第i个区间一定吃的最多吃到的窗口数,答案对所有f取max
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,f[N],ans;
struct node{
int l,r;
}a[N];
inline bool cmp(node a,node b)
{
if(a.l!=b.l)return a.l<b.l;
return a.r<b.r;
}
int main()
{
#ifdef LOCAL
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].l>>a[i].r;
f[i]=a[i].r-a[i].l+1;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(a[j].r<a[i].l)
f[i]=max(f[i],f[j]+a[i].r-a[i].l+1);
}
}
for(int i=1;i<=n;i++)ans=max(ans,f[i]);
cout<<ans;
return 0;
}