URAL 1007 Code Words

URAL_1007

    按题目的要求依次检查各个可能出错的位置即可。

#include<stdio.h>
#include<string.h>
#define MAXD 1010
int N, M, A[MAXD], S;
char b[MAXD];
void checkreplace()
{
    int i, j, k;
    for(i = 0; i < M; i ++)
        if(b[i] == '1' && (S - i - 1) % (N + 1) == 0)
        {
            b[i] = '0';
            printf("%s\n", b);
            return ;
        }
}
void checkremove()
{
    int i, j, k;
    for(i = 0; i < M; i ++)
    {
        if((S + A[i]) % (N + 1) == 0)
        {
            for(j = 0; j < i; j ++)
                printf("%c", b[j]);
            printf("0");
            for(j = i; j < M; j ++)
                printf("%c", b[j]);
            printf("\n");
            return ;
        }
        if((S + A[i] + i + 1) % (N + 1) == 0)
        {
            for(j = 0; j < i; j ++)
                printf("%c", b[j]);
            printf("1");
            for(j = i; j < M; j ++)
                printf("%c", b[j]);
            printf("\n");
            return ;
        }
    }
    printf("%s", b);
    if(S % (N + 1) == 0)
        printf("0\n");
    else
        printf("1\n");
}
void checkinsert()
{
    int i, j, k;
    for(i = 0; i < M; i ++)
        if((b[i] == '1' && (S - i - A[i]) % (N + 1) == 0) || (b[i] == '0' && (S - A[i]) % (N + 1) == 0))
        {
            b[i] = '\0';
            printf("%s", b);
            printf("%s\n", b + i + 1);
            return ;
        }
}
void solve()
{
    int i, j, k;
    M = strlen(b);
    A[M] = S = 0;
    for(i = M - 1; i >= 0; i --)
    {
        A[i] = A[i + 1] + b[i] - '0';
        if(b[i] == '1')
            S += i + 1;
    }
    if(N == M)
    {
        if(S % (N + 1) == 0)
            printf("%s\n", b);
        else
            checkreplace();
    }
    else if(M < N)
        checkremove();
    else
        checkinsert();
}
int main()
{
    scanf("%d", &N);
    while(scanf("%s", b) == 1)
    {
        solve();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/staginner/p/2477246.html