求助,70分
查看原帖
求助,70分
758211
zhangchenyi0509楼主2024/8/4 18:40
#include <bits/stdc++.h>
using namespace std;
int n,m,k,p,l,h,dx[10005],dy[1005],f[10005][1005],ans=2139062143;
bool flag[10005][1005],flag2[10005];
int main()
{
	cin>>n>>m>>k;
	memset (f,127,sizeof (f));
	for (int i=0;i<n;i++)
	{
		cin>>dx[i]>>dy[i];
	}
	for (int i=1;i<=k;i++)
	{
		cin>>p>>l>>h;
		for (int j=0;j<=l;j++)
		{
			flag[p][j]=true;
		}
		for (int j=h;j<=m;j++)
		{
			flag[p][j]=true;
		}
		flag2[p]=true;
	}
	for (int i=1;i<=m;i++)
	{
		f[0][i]=0;
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++)
		{
			if (flag[i][j])
			{
				continue;
			}
			if (j+dy[i-1]<=m)
			{
				if (!flag[i-1][j+dy[i-1]])
				{
					f[i][j]=min (f[i][j],f[i-1][j+dy[i-1]]);
				}
			}
			if (j>=1&&j<m)
			{
				for (int k=1;j-k*dx[i-1]>=1;k++)
				{
					if (flag[i-1][j-k*dx[i-1]])
					{
						continue;
					}
					f[i][j]=min (f[i][j],f[i-1][j-k*dx[i-1]]+k);
				}	
			}
			else if (j==m)
			{
				for (int k=1;k<=m;k++)
				{
					if (flag[i-1][k])
					{
						continue;
					}
					int tw=(m-k)/dx[i-1];
					if (m-k>dx[i-1]&&(m-k)%dx[i-1])
					{
						tw++;
					}
					else if (m-k<dx[i-1])
					{
						tw++;
					}
					f[i][m]=min (f[i][m],f[i-1][k]+tw);
				}
			}
		}
	}
	for (int i=1;i<=m;i++)
	{
		ans=min (f[n][i],ans);
	}
	if (ans==2139062143)
	{
		int acnt=0;
		for (int i=0;i<=n;i++)
		{
			for (int j=1;j<=m;j++)
			{
				if (f[i][j]!=2139062143&&flag2[i])
				{
					acnt++;
					break;
				}
			}
		}
		cout<<0<<endl<<acnt<<endl;
	}
	else
	{
		cout<<1<<endl<<ans<<endl;
	}
	return 0;
}
2024/8/4 18:40
加载中...