70pts求调
查看原帖
70pts求调
1163457
UncleEric楼主2024/4/5 12:02

5WA 1TLE

如题,找了一会儿还是没发现问题

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*f;
}

int n,m,k,h[10005],l[10005],pp,ans=1e9,p,up[10005],down[10005],dp[10005][1005];

int main(){
	n=read();m=read();k=read();
	for(int i=0;i<n;i++){
		up[i]=read();down[i]=read();
	}
	while(k--){
		p=read();l[p]=read();h[p]=read();
	}
	for(int i=1;i<=n;i++){
		for(int j=m;j>=1;j--){
			dp[i][j]=1e9;
		}
	}
	for(int i=1;i<=n;i++){
		bool canget=0;
		if(h[i]){	
			for(int j=h[i]-1;j>l[i];j--){
				if(j<=m-down[i-1]&&dp[i-1][j+down[i-1]]!=1e9){
					dp[i][j]=min(dp[i][j],dp[i-1][j+down[i-1]]);
					canget=1;
				}
				for(register int k=j-up[i-1],l=1;k>0;k-=up[i-1],l++){
					if(dp[i-1][k]==1e9)continue;
					dp[i][j]=min(dp[i][j],dp[i-1][k]+l);
					canget=1;
				}
			}
			pp++;
		}else{
			for(int j=m;j>0;j--){
				if(j<=m-down[i-1]&&dp[i-1][j+down[i-1]]!=1e9){
					dp[i][j]=min(dp[i][j],dp[i-1][j+down[i-1]]);
					canget=1;
				}
				if(j==m){
					for(register int k=j;k>=j-up[i-1];k--){
						if(dp[i-1][k]==1e9)continue;
						dp[i][j]=min(dp[i][j],dp[i-1][k]+1);
						canget=1;						
					}
					continue;
				}
				for(register int k=j-up[i-1],l=1;k>0;k-=up[i-1],l++){
					if(dp[i-1][k]==1e9)continue;
					dp[i][j]=min(dp[i][j],dp[i-1][k]+l);
					canget=1;
				}				
			}
		}
		if(!canget){
			if(h[i])pp--;
			cout<<0<<endl<<pp;
			return 0;
		}
	}
	for(int i=1;i<=m;i++){
		ans=min(ans,dp[n][i]);
	}
	cout<<1<<endl<<ans;
	return 0; 
}
2024/4/5 12:02
加载中...