求助站外题
  • 板块学术版
  • 楼主AAA404
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/14 19:46
  • 上次更新2023/11/3 03:47:51
查看原帖
求助站外题
723198
AAA404楼主2023/8/14 19:46

小明提供 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;
}
2023/8/14 19:46
加载中...