60pts~求调
查看原帖
60pts~求调
539388
skw66615楼主2023/7/17 10:29
#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int dp[maxn][1005],up[maxn],down[maxn],n,m,k,flag[maxn],sum,inf;
bool pd;
struct data
{
	int low,high;
}l[maxn];
int main()
{
	n=read();m=read();k=read();
	for(int i=0;i<n;i++)
	{
		up[i]=read();down[i]=read();
		l[i].high=m+1;l[i].low=0;
	}
	l[n].high=m+1;l[n].low=0;
	for(int i=1;i<=k;i++)
	{
		int x,a,b;
		x=read();a=read();b=read();
		flag[x]=1;
		l[x].low=a;l[x].high=b;
	}
	memset(dp,63,sizeof(dp));
	inf=dp[0][0];
	for(int j=0;j<=m;j++)
	dp[0][j]=0;
	for(int i=1;i<=n;i++)
	{
		pd=0;
		for(int j=1;j<=m;j++)
		{
			if(j<=l[i].low||j>=l[i].high)
			continue;
			if(j-up[i-1]>0)
			{
				dp[i][j]=min(dp[i][j],dp[i-1][j-up[i-1]]+1);
				dp[i][j]=min(dp[i][j],dp[i][j-up[i-1]]+1);
			}
			if(j==m)
			{
				for(int k=m-up[i-1];k<=m;k++)
				{
					dp[i][m]=min(dp[i-1][k]+1,dp[i][m]);
				}
			}
			if(j+down[i-1]<=m)
			{
				dp[i][j]=min(dp[i][j],dp[i-1][j+down[i-1]]);
			}
			if(dp[i][j]<inf)
			pd=1;
		}
		if(!pd)
		{
			printf("0\n%d",sum);
			return 0;
		}
		if(flag[i])
		sum++;
	}
	int mint=2e9;
	for(int j=1;j<=m;j++)
		mint=min(mint,dp[n][j]);
	printf("1\n%d",mint);
	return 0;
}
``` c++
2023/7/17 10:29
加载中...