蒟蒻求助,样例过了,为什么还是0分

P1015 [NOIP1999 普及组] 回文数

STARSczy @ 2023-03-15 20:48:30

rt


#include<bits/stdc++.h>
using namespace std;

int a[1000],b[1000],len,k;
bool f(){
    for(int i=1;i<=len/2;++i) if(a[i]!=a[len-i]) return 0;
    return 1;
}

signed main(){
    scanf("%d\n",&k);
    for(;1;){
        char c=getchar();
        ++len;
        if(c=='\n') break;
        else if(c>='0'&&c<='9') a[len]=c-'0';
        else a[len]=c-'A'+10;
    }
    for(int i=1;i<=len/2;++i) swap(a[i],a[len-i]);
    if(f()){
        printf("STEP=0");
        return 0;
    }
    for(int s=1;s<=30;++s){
        memset(b,0,500);
        for(int i=1;i<len;++i) b[i]=a[len-i];
        for(int i=1;i<len;++i){
            if(a[i]+b[i]>=k){
                if(i+1==len) ++len,a[i+1]=0;
                a[i+1]+=((a[i]+b[i])/k);
            }
            a[i]=(a[i]+b[i])%k;
        }
        if(f()){
            printf("STEP=%d",s);
            return 0;
        }
    }
    printf("Impossible!");
    return 0;
}

by Eleveslaine @ 2023-03-15 20:49:30

@AIDczy 能不能换个头像,大晚上看着挺瘆人的。


by MuLinnnnn @ 2023-03-15 20:54:26

@Franz_Liszt


by Eleveslaine @ 2023-03-15 20:57:29

@bj12z_dingbolin ?只是一个建议


by MuLinnnnn @ 2023-03-15 21:04:21

@Franz_Liszt 好吧


by smallpeter @ 2023-03-15 22:14:25

@AIDczy 很多问题,我一个一个说吧。首先这题数据可能多了一些什么空格换行之类的,所以你这个输入是有问题的。其次,你的第二步是把输入的 a 倒过来,但是 i 关于回文串中心对称的点是 len-i+1,而不是 len-i。你的 f check 函数以及后面for循环里复制一份相反的a数组到b上也出现了同样的错误。

经过修改后的代码如下:

#include<bits/stdc++.h>
using namespace std;

char c[1000];

int a[1000],b[1000],len,k;
bool f(){
    for(int i=1;i<=len/2;++i) if(a[i]!=a[len-i+1]) return 0;
    return 1;
}

signed main(){
    scanf("%d",&k);
    cin>>c+1;
    len=strlen(c+1);
    for(int i=1;i<=len;i++){
        if(c[i]>='0'&&c[i]<='9') a[i]=c[i]-'0';
        else a[i]=c[i]-'A'+10;
    }
    for(int i=1;i<=len/2;++i) swap(a[i],a[len-i+1]);
    if(f()){
        printf("STEP=0");
        return 0;
    }
    for(int s=1;s<=30;++s){
        memset(b,0,500);
        for(int i=1;i<=len;++i) b[i]=a[len-i+1];
        for(int i=1;i<=len;++i){
            if(a[i]+b[i]>=k){
                if(i==len) ++len,a[len]=0;
            }
            a[i+1]+=((a[i]+b[i])/k);
            a[i]=(a[i]+b[i])%k;
        }
        if(f()){
            printf("STEP=%d",s);
            return 0;
        }
    }
    printf("Impossible!");
    return 0;
}

by beifa @ 2023-03-15 22:25:34

@small_peter 支持


|