社区讨论
玄关求调
P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlh9koes
- 此快照首次捕获于
- 2026/02/11 08:00 上周
- 此快照最后确认于
- 2026/02/11 09:00 上周
65pts,13AC+7WA,Record。#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k,x[10005],y[10005],p,l[10005],h[10005],dp[2][1005],ans,pas;
bool v;
int main(){
// freopen("P1941_12.in","r",stdin);
// freopen("P1941.out","w",stdout);
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<n;i++)scanf("%d %d",&x[i],&y[i]);
for(int i=1;i<=n;i++)h[i]=m+1;
for(int i=1;i<=k;i++){
scanf("%d %d %d",&p,&l[0],&h[0]);
l[p]=l[0];
h[p]=h[0];
}
l[0]=0,h[0]=m+1;
dp[0][0]=1e9;
// for(int i=0;i<=m;i++)dp[0][i]=1e9;
// dp[0][1]=0;
for(int i=1;i<=n;i++){
v=false;
for(int j=0;j<=m;j++)dp[i%2][j]=1e9;
for(int j=max(l[i],x[i-1])+1;j<h[i];j++)
dp[i%2][j]=min(dp[i%2][j-x[i-1]],dp[(i+1)%2][j-x[i-1]])+1;
if(h[i]==m+1)for(int j=m-x[i-1];j<m;j++)
dp[i%2][m]=min(dp[i%2][m],min(dp[i%2][j],dp[(i+1)%2][j])+1);
for(int j=max(l[i],l[i-1]-y[i-1])+1;j<min(h[i-1]-y[i-1],h[i]);j++)
dp[i%2][j]=min(dp[i%2][j],dp[(i+1)%2][j+y[i-1]]);
for(int j=l[i]+1;j<h[i];j++){
// printf("%d %d %d\n",i,j,dp[i%2][j]);
if(dp[i%2][j]<1e9)v=true;
}
// for(int j=l[i]+1;j<h[i];j++)if(dp[i%2][j]!=1e9){
// if(l[i+1]<j-y[i] && j-y[i]<h[i+1])
// dp[(i+1)%2][j-y[i]]=
// min(dp[(i+1)%2][j-y[i]],dp[i%2][j]);
// for(int kk=max((l[i+1]-j)/x[i]+1,1);j+kk*x[i]<h[i+1];kk++)
// dp[(i+1)%2][j+kk*x[i]]=
// min(dp[(i+1)%2][j+kk*x[i]],dp[i%2][j]+kk);
// if(h[i+1]==m+1)
// dp[(i+1)%2][m]=min(dp[(i+1)%2][m],
// dp[i%2][j]+(m-j-1)/x[i]+1);
// v=true;
// //printf("%d %d %d %d\n",i,j,dp[i%2][j],pas);
// }
if(v && (l[i]>0 || h[i]<=m))pas++;
if(!v)break;
}
ans=1e9;
for(int i=l[n]+1;i<h[n];i++)ans=min(ans,dp[n%2][i]);
if(v)printf("1\n%d",ans);
else printf("0\n%d",pas);
return 0;
}
另一个疑问:
如果点击屏幕,小鸟就会上升一定高度 ,每个单位时间可以点击多次,效果叠加;如果不点击屏幕,小鸟就会下降一定高度 。
也就是说,上升和下降是不能同时进行的。但我改成可以同时进行后,就拿了
70pts。求大佬帮我调一下——
回复
共 0 条回复,欢迎继续交流。
正在加载回复...