[求助] 传说中的本地AC评测WA掉的情况发生在我的身上了QAQ

P2704 [NOI2001] 炮兵阵地

_YPC @ 2018-10-29 15:41:01

这道题目我第一个点WA了,但是各位想想,这题目的第一个点就是样例,我怎么可能样例没过就提交啊……而且我自己也把这个这点下载下来测过了,Van♂全没有问题啊……

这个是数据:

Sample Input:
5 4
PHPP
PPHH
PPPP
PHPP
PHHP

Sample Output:
6

然后这个是代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=106,maxs=(1<<10)+6;
int f[2][maxs][maxs],n,tot[maxn],sta[maxn][maxs],m,ans;
inline void get_status(int x,int t){
    for (int i=0;i<(1<<m);i++){
        if ((i&t)||(i&(i<<1))||(i&(i<<2)))continue;
        sta[x][++tot[x]]=i;
    }
}
inline int get_one(int x){
    int ret=0;
    while (x)ret=ret+x%2,x>>=1;
    return ret;
}
int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++){
        getchar();
        int t=0;
        for (int j=1;j<=m;j++){
            char ch=getchar();
            if (ch=='P')t=(t<<1);else t=(t<<1)+1;
        }
        get_status(i,t);
    }
    sta[0][tot[0]=1]=0;
    for (int i=1;i<=tot[1];i++)f[1][i][1]=get_one(sta[1][i]);
    for (int i=2;i<=n;i++)
    for (int j=1;j<=tot[i];j++)
    for (int k=1;k<=tot[i-1];k++){
        if (sta[i][j]&sta[i-1][k])continue;
        for (int a=1;a<=tot[i-2];a++){
            if ((sta[i][j]&sta[i-2][a])||(sta[i-1][k]&sta[i-2][a]))continue;
            f[i&1][j][k]=max(f[i&1][j][k],f[(i-1)&1][k][a]+get_one(sta[i][j]));
        }
    }
    for (int i=1;i<=n;i++)
    for (int j=1;j<=tot[i];j++)
    for (int k=1;k<=tot[i-1];k++)ans=max(ans,f[i&1][j][k]);
    printf("%d\n",ans);
    return 0;
}

这个点我在洛谷上测出来的是5,但是本地跑就是6……(各位可以把我的代码拷贝下来自己测一下qwq)

非常难受啊,求巨佬解答QAQ。


by 哔哩哔哩 @ 2018-10-29 15:43:39

日常膜YPC[1/1]get!


by _YPC @ 2018-10-29 15:44:00

@哔哩哔哩 QAQ


by fantianqi @ 2018-10-29 15:46:31

%

%

%

%

%
%
%

%

%

%

%


by shadowice1984 @ 2018-10-29 16:00:34

我太菜了看不懂您的代码QwQ

当你死活调不过去一道题的时候重构代码是最有效的调试工具


by Flandre_495 @ 2018-10-29 16:58:53

不要跟评测机较真了;

直接特判吧。。


by jeffqi @ 2018-10-29 17:00:21

@_YPC

#include<bits/stdc++.h>
using namespace std;
const int maxn=106,maxs=65;
int f[2][maxs][maxs],n,tot[maxn],sta[maxn][maxs],m,ans;
inline void get_status(int x,int t){
    for (int i=0;i<(1<<m);i++){
        if ((i&t)||(i&(i<<1))||(i&(i<<2)))continue;
        sta[x][++tot[x]]=i;
    }
}
inline int get_one(int x){
    int ret=0;
    while (x)ret=ret+x%2,x>>=1;
    return ret;
}
int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++){
        int t=0;
        for (int j=1;j<=m;j++){
            char ch; cin>>ch;
            if (ch=='P')t=(t<<1);else t=(t<<1)+1;
        }
        get_status(i,t);
    }
    for (int i=1;i<=tot[1];i++)f[1][i][1]=get_one(sta[1][i]);
    for (int i=1;i<=tot[2];i++)
    for (int j=1;j<=tot[1];j++){
        if(sta[2][i]&sta[1][j])continue;
        f[0][i][j]=max(f[0][i][j],f[1][j][1]+get_one(sta[2][i]));
    }
    for (int i=3;i<=n;i++)
    for (int j=1;j<=tot[i];j++)
    for (int k=1;k<=tot[i-1];k++){
        if (sta[i][j]&sta[i-1][k])continue;
        for (int a=1;a<=tot[i-2];a++){
            if ((sta[i][j]&sta[i-2][a])||(sta[i-1][k]&sta[i-2][a]))continue;
            f[i&1][j][k]=max(f[i&1][j][k],f[(i-1)&1][k][a]+get_one(sta[i][j]));
        }
    }
    for (int j=1;j<=tot[n];j++)
    for (int k=1;k<=tot[n-1];k++)ans=max(ans,f[n&1][j][k]);
    printf("%d\n",ans);
    return 0;
}

改完了 前两行特判一下 输出时只考虑最后一行


by jeffqi @ 2018-10-29 17:05:50

@_YPC 而且你的代码在lgIDE上输出也是四


by jeffqi @ 2018-10-29 17:06:13

@jeffyang 打错了 是5


by _YPC @ 2018-10-29 17:48:21

@jeffyang 但是在本地上确实是6啊QAQ


by _YPC @ 2018-10-29 17:48:40

@jeffyang 另外,%%%巨佬QAQ


| 下一页