救救已经交了30遍却不知道错哪里的蒟蒻吧

P2157 [SDOI2009] 学校食堂

各位大佬QAQ,此问题已解决 这个是一种AC写法 ```cpp #include<bits/stdc++.h> using namespace std; const int N=1005; int t[N],b[N]; int f[N][1<<8][20]; int c,n; int TM(int x,int y) { if(x==0) return 0; return t[x]^t[y]; } int main() { scanf("%d",&c); while(c--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",t+i,b+i); memset(f,0x3f,sizeof(f)); int mx=f[0][0][0]; for(int i=0;i<=7;i++) { if(1+i>mx) break; mx=min(mx,1+i+b[1+i]); f[1][1<<i][i+8]=0; } for(int i=1;i<=n;i++) for(int j=0;j<(1<<8);j++) for(int k=-8;k<=7;k++) if(f[i][j][k+8]!=f[0][0][0]) { if(j&1) f[i+1][j>>1][k+7]=min(f[i+1][j>>1][k+7],f[i][j][k+8]); else { int mxr=f[0][0][0]; for(int r=0;r<=7;r++) { if(j&(1<<r)) continue; if(i+r>mxr) break; mxr=min(mxr,i+r+b[i+r]); f[i][j|(1<<r)][r+8]=min(f[i][j|(1<<r)][r+8],f[i][j][k+8]+TM(i+k,i+r)); } } } int ans=0x7fffffff; for(int i=-8;i<=0;i++) ans=min(ans,f[n][1][i+8]); printf("%d\n",ans); } return 0; } ``` 如果我加上预处理bi就会错,为什么QAQ 因为,它根本不能预处理QAQ 我一开始认为它可以预处理,因为我考虑这样的情况: 站位:我->大佬1->大佬2-> @[Ebola](/space/show?uid=20158) b1=3,b2=1,b3=1,b4=1 我预处理一下之后b1=2 我认为在这种情况下由于大佬1只让他后面1个人插队,因此[Ebola](/space/show?uid=20158)不能插,所以我只能被大佬1和大佬2插 吗QAQ 然而现实却是。。。 大佬1插我,然后大佬2插我,然后[Ebola](/space/show?uid=20158)就可以插我了QAQ 也就是大佬1插完我之后[Ebola](/space/show?uid=20158)就不受大佬1的限制,可以插我了QAQ 因此,预处理不行 并且请注意 ```cpp #include<bits/stdc++.h>//AC using namespace std; const int N=1005; int t[N],b[N]; int f[N][1<<8][20]; int c,n; int TM(int x,int y) { if(x==0) return 0; return t[x]^t[y]; } int main() { scanf("%d",&c); while(c--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",t+i,b+i); memset(f,0x3f,sizeof(f)); int mx=f[0][0][0]; for(int i=0;i<=7;i++) { if(1+i>mx) break; mx=min(mx,1+i+b[1+i]); f[1][1<<i][i+8]=0; } for(int i=1;i<=n;i++) for(int j=0;j<(1<<8);j++) for(int k=-8;k<=7;k++) if(f[i][j][k+8]!=f[0][0][0]) { if(j&1) f[i+1][j>>1][k+7]=min(f[i+1][j>>1][k+7],f[i][j][k+8]); else { int mxr=f[0][0][0]; for(int r=0;r<=7;r++) { if(j&(1<<r)) continue; if(i+r>mxr) break; mxr=min(mxr,i+r+b[i+r]); f[i][j|(1<<r)][r+8]=min(f[i][j|(1<<r)][r+8],f[i][j][k+8]+TM(i+k,i+r)); } } } int ans=0x7fffffff; for(int i=-8;i<=0;i++) ans=min(ans,f[n][1][i+8]); printf("%d\n",ans); } return 0; } ``` 中的 ```cpp for(int r=0;r<=7;r++) { if(j&(1<<r)) continue; if(i+r>mxr) break; mxr=min(mxr,i+r+b[i+r]); f[i][j|(1<<r)][r+8]=min(f[i][j|(1<<r)][r+8],f[i][j][k+8]+TM(i+k,i+r)); } ``` 不能改成 ```cpp for(int r=0;r<=7;r++) { if(i+r>mxr) break; mxr=min(mxr,i+r+b[i+r]); if(j&(1<<r)) continue; f[i][j|(1<<r)][r+8]=min(f[i][j|(1<<r)][r+8],f[i][j][k+8]+TM(i+k,i+r)); } ``` 原理同上QAQ一样32分
by salix_leaf @ 2019-04-06 21:48:33


哎呀代码复制好像有点丑,不要在意啦QAQ
by salix_leaf @ 2019-04-06 21:49:47


~~您在讨论区写了个题解~~
by 天泽龟 @ 2019-08-09 12:29:07


@[salix_leaf](/space/show?uid=59700) 写了两天转过头来发现错误点和您一样,您真是个好人QwQ。。
by 天泽龟 @ 2019-08-11 13:05:13


@[天泽龟](/space/show?uid=15984) 退役选手祝您AK
by salix_leaf @ 2019-08-25 17:19:44


orz 非常感谢
by 彼岸归航 @ 2019-10-30 15:19:36


|