70pts 其他点WA了 不太明白为什么 谢谢大佬Orz
查看原帖
70pts 其他点WA了 不太明白为什么 谢谢大佬Orz
421758
HANDSOME_FZZ楼主2023/7/29 16:38
#include <bits/stdc++.h>
#define N 10000
#define M 1000
#define K 1e+9
using namespace std;
int n,m,k,dp[N][M],ans,sum;
struct click{
	int x,y;
}w[N];

struct pipe{
	int l,r;
}q[N];

int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}

void loading(){
	n=read(); m=read(); k=read();
	for(int i=0;i<n;i++){ w[i].x=read(); w[i].y=read();}
	for(int i=1;i<=k;i++){
		int s=read();
		q[s].l=read(); q[s].r=read();
	}
	ans=1e+9;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) dp[i][j]=K;
		if(q[i].l==q[i].r) q[i].r=m+1;
	}
	//for(int i=1;i<=m;i++) dp[0][i]=0;//全局变量的特性 
}

bool ok(int i,int y){
	if(y>m&&q[i].r==m+1) return 1;
	if(y<q[i].r && y>q[i].l) return 1;
	return 0;
}

void solve(){
	for(int i=0;i<n;i++){
		bool f=0;
		for(int k=1;k<=m;k++){
			if(dp[i][k]==K) continue;//每到过 
			if(ok(i+1,k-w[i].y)){
				f=1;
				dp[i+1][k-w[i].y]=min(dp[i][k],dp[i+1][k-w[i].y]);//下降是合法的
				//cout<<i<<' '<<k<<' '<<i+1<<' '<<k-w[i].y<<' '<<dp[i+1][k-w[i].y]<<endl;
			}
			int t=k+w[i].x,num=1;
			while(ok(i+1,t)){
				f=1;
				if(t>m && q[i+1].r==m+1) { dp[i+1][m]=min(dp[i+1][m],dp[i][k]+num); break;}
				dp[i+1][t]=min(dp[i+1][t],dp[i][k]+num);
				//cout<<i<<' '<<k<<' '<<i+1<<' '<<t<<' '<<dp[i+1][t]<<endl;
				t+=w[i].x; num++;
			} 
			
		}
		if(!f){ cout<<0<<endl<<sum; return;}//到不了
		if(q[i].r-q[i].l<=m && i) sum++; //cout<<"*"<<q[i].r<<' '<<q[i].l<<' '<<i<<' '<<num<<endl; 
		for(int i=1;i<=m;i++) ans=min(ans,dp[n][i]);
	}
	cout<<1<<endl<<ans;
}

int main(){
	//freopen("bird.in","r",stdin);
	loading();
	solve();
	return 0;
}

2023/7/29 16:38
加载中...