90pts求调
查看原帖
90pts求调
631550
liuziqin楼主2024/5/6 21:12
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
const int INF=0x3f3f3f;
int dp[N][1005],x[N],y[N],h1[N],h2[N];
bool vis[N][1005],flag[N];
int main(){
	int n,m,q;
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
	for(int i=1;i<=n;i++)h1[i]=1,h2[i]=m;
	for(int i=1;i<=q;i++){
		int p,l,h;
		cin>>p>>l>>h;
		flag[p]=1;
		h1[p]=l+1,h2[p]=h-1;
	}
	memset(dp,INF,sizeof(dp));
	for(int i=1;i<=m;i++)dp[0][i]=0;
	for(int i=1;i<=n;i++){
		for(int j=x[i]+1;j<=m+x[i];j++)
			dp[i][j]=min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1);
		for(int j=m+1;j<=m+x[i];j++)
			dp[i][m]=min(dp[i][m],dp[i][j]);
		for(int j=1;j<=m-y[i];j++)
			dp[i][j]=min(dp[i][j],dp[i-1][j+y[i]]);
		for(int j=1;j<h1[i];j++)dp[i][j]=INF;
		for(int j=h2[i]+1;j<=m;j++)dp[i][j]=INF;
	}
	int ans=INF;
	for(int i=1;i<=m;i++)ans=min(ans,dp[n][i]);
	if(ans<INF){
		cout<<"1\n"<<ans<<"\n";
		return 0;
	}
	cout<<"0\n";
	int i,j;
	for(i=n;i>=1;i--){
		for(j=1;j<=m;j++)if(dp[i][j]<INF)break;
		if(j<=m)break;
	}
	ans=0;
	for(int j=1;j<=i;j++)if(flag[j])ans++;
	cout<<ans<<"\n";
	return 0;
}
2024/5/6 21:12
加载中...