警示后人
查看原帖
警示后人
233445
_TONG_楼主2025/7/24 16:00

鸟可能在高度已经到达m时顶格跳从而防止下降。

#include<bits/stdc++.h>
#define inf 10000000
using namespace std;
const int MXN = 1000010;
int n,m,k,ans=inf,pans;
int f[MXN],g[MXN];
struct point
{
	int u,d,l,r,s;
}a[MXN];
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	{
		a[i].l=1;a[i].r=m;
		scanf("%d%d",&a[i].u,&a[i].d);
	}
	for(int i=1;i<=k;i++)
	{
		int p,l,r;
		scanf("%d%d%d",&p,&l,&r);
		a[p].l=max(a[p].l,l+1);
		a[p].r=min(a[p].r,r-1);
		a[p].s=1;
	}
	for(int i=1;i<=n;i++)
	{
		a[i].s+=a[i-1].s;
	}
	f[0]=g[0]=inf;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) g[j]=inf;
		for(int j=a[i].u+1;j<=a[i].r;j++)
		{
			g[j]=min(g[j-a[i].u],f[j-a[i].u])+1;
		}
		if(a[i].r==m) for(int j=max(m-a[i].u+1,1);j<m;j++)//将j<m改为j<=m即可通过
		{
			g[m]=min(min(g[j],f[j])+1,g[m]);
		}
		for(int j=a[i].l;j<=a[i].r;j++)
		{
			if(j+a[i].d<=m) g[j]=min(g[j],f[j+a[i].d]);
		}
		for(int j=1;j<=m;j++)
		{
			f[j]=inf;
			if(j>=a[i].l&&j<=a[i].r&&g[j]<inf)
			{
				if(i==n) ans=min(ans,g[j]);
				pans=a[i].s;f[j]=g[j];
			}
//			cout<<f[j]<<" ";
		}
//		cout<<endl;
	}
	cout<<(ans<inf)<<endl<<(ans<inf?ans:pans);
	return 0;
}
2025/7/24 16:00
加载中...