社区讨论

30pts玄关求条

P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@miu12fl4
此快照首次捕获于
2025/12/06 16:24
3 个月前
此快照最后确认于
2025/12/08 18:45
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,k,ans=INT_MAX,cnt;
int a[10010],b[10010],u[10010],d[10010];
int dp[10010][1010];
bool vis[10010];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
	}
	for(int i=1;i<=k;i++){
		int p,x,y;
		cin>>p>>x>>y;
		u[p]=y;
		d[p]=x;
		vis[p]=1;
	}
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=m;i++){
		dp[0][i]=0;
	}
	for(int i=1;i<=n;i++){
		//上
		for(int j=a[i]+1;j<=m;j++){
			dp[i][j]=min({dp[i][j],dp[i-1][j-a[i]]+1,dp[i][j-a[i]]+1});
			//不变,从上一时刻按一下,从这一时刻按一下 
		} 
		for(int j=m-a[i];j<=m;j++){
			dp[i][m]=min(dp[i][m],dp[i-1][j]+1);
			//m可以从m-a[i]~m转移
		}
		//下 
		for(int j=1;j<=m-a[i];j++){
			dp[i][j]=min(dp[i][j],dp[i-1][j+b[i]]);
			//从j+a[i]掉到j 
		}
		//这里有柱子 
		if(vis[i]){
			for(int j=1;j<=d[i];j++){
				dp[i][j]=2e9;
			}
			for(int j=u[i];j<=m;j++){
				dp[i][j]=2e9;
			}
		}
		int minn=2e9;
		for(int j=1;j<=m;j++){
			minn=min(minn,dp[i][j]);
		}
		if(minn>1e8) break;
		cnt+=vis[i];
	}
	if(cnt<k){
		cout<<0<<"\n"<<cnt;
		return 0;
	}
	cout<<"1\n";
	if(vis[n]){
		for(int j=d[n]+1;j<=u[n];j++){
			ans=min(ans,dp[n][j]);
		}
		cout<<ans;
		return 0;
	}
	for(int j=1;j<=m;j++){
		ans=min(ans,dp[n][j]);
	}
	cout<<ans;
	return 0;
}
30分,错误点分布相对均匀,大部分都是输出答案比正确答案,小部分会把可以到达判成不可以

回复

0 条回复,欢迎继续交流。

正在加载回复...