社区讨论
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 条回复,欢迎继续交流。
正在加载回复...