求助求助
查看原帖
求助求助
330026
wmq2006楼主2020/7/22 19:01
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>

using namespace std;
int n,f[10001][1001]={0},m,a[10001],b[10001],x[10001],y,z,p,ans=1e9,s[10001]={0},q[10001]={0};
//string s;
int main(){
	//freopen("bird.in","r",stdin);
	//freopen("bird.out","w",stdout);
	cin>>n>>m>>p;
	for(int i=0;i<n;i++)cin>>a[i]>>b[i];
	for(int i=1;i<=p;i++){
		cin>>x[i]>>y>>z;
		s[x[i]]=1;
		for(int j=0;j<=m;j++){
			if(j<=y||j>=z)f[x[i]][j]=-1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(f[i][j]!=-1)f[i][j]=1e9;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			if(f[i][j]!=-1){
				if(j==m){
					if(f[i-1][j]!=-1)f[i][j]=min(f[i][j],f[i-1][j]+1);
					for(int k=1;k<m;k++){
						if(k%a[i-1]==0&&f[i-1][j-k]!=-1)f[i][j]=min(f[i][j],f[i-1][j-k]+k/a[i-1]);
						if(k%a[i-1]!=0&&f[i-1][j-k]!=-1)f[i][j]=min(f[i][j],f[i-1][j-k]+k/a[i-1]+1);
					}
				}
				else{
					if(j+b[i-1]<=m&&f[i-1][j+b[i-1]]!=-1)f[i][j]=min(f[i][j],f[i-1][j+b[i-1]]);
					if(f[i][j-a[i-1]]!=-1&&j>a[i-1])f[i][j]=min(f[i][j],f[i][j-a[i-1]]+1);
					if(f[i-1][j-a[i-1]]!=-1&&j>a[i-1])f[i][j]=min(f[i][j],f[i-1][j-a[i-1]]+1);
				}
			}
		}
	}
	for(int i=1;i<=m;i++)ans=min(f[n][i],ans);
	/*for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cout<<f[i][j]<<" ";
			}
			cout<<endl;
		}*/
	if(ans!=-1&&ans!=1e9)cout<<1<<endl<<ans<<endl;
	if(ans==1e9||ans==-1){
		if(s[0]==1)q[0]=1;
		for(int i=1;i<=n;i++){
			if(s[i]==1)q[i]=q[i-1]+1;
			else q[i]=q[i-1];
		}
		for(int i=0;i<=n;i++){
			int flag=0;
			for(int j=1;j<=m;j++){
				if(f[i][j]>=0&&f[i][j]!=1e9)flag=1;
			}
			if(flag==1)ans=q[i];
			else break;
		}
		cout<<0<<endl<<ans<<endl;
	}
	return 0;
}

代码只有80分

问题出在:比如这组数据:

3 1000 2
2 1
2 1
2 1
1 1 10
2 980 990

输出显示无法到达,但是可以。问题就是每一个f[i][j]是从两个地方转移而来,我们默认f[i][j-a[i-1]]保存了最优值这样就免去过度枚举K了就是第三重循环可是如果没有办法从上面提到的那个地方转移有没有办法从f[i-1][j-a[i-1]]转移的话就出现了问题。比如如果两个地方都是管道。这个问题怎么解决呢?求助谢谢

2020/7/22 19:01
加载中...