社区讨论

玄关求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mlh9koes
此快照首次捕获于
2026/02/11 08:00
上周
此快照最后确认于
2026/02/11 09:00
上周
查看原帖
65pts,13AC+7WARecord
CPP
#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;
}
另一个疑问:
如果点击屏幕,小鸟就会上升一定高度 xx,每个单位时间可以点击多次,效果叠加;如果不点击屏幕,小鸟就会下降一定高度 yy
也就是说,上升和下降是不能同时进行的。但我改成可以同时进行后,就拿了 70pts
求大佬帮我调一下——

回复

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

正在加载回复...