• CodeForces 625D Finals in arithmetic


    神奇的构造题,我的思路比较奇葩。搞了好久,看到WA on 91我绝望了,然后自己造数据,找到了错误,总算是AC了,现在是凌晨0:24分,看到AC之后,感动China!

    我写的代码无比的长。。。。。应该有很简单的方法吧。。。。。没想到。

    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <queue>
    #include <stack>
    #include <map>
    #include <vector>
    using namespace std;
    
    const int maxn = 100000 + 100;
    char s[maxn];
    int a[maxn], b[maxn], sum[maxn], flag[maxn];
    int tmpa[maxn], tmpb[maxn], ans[maxn];
    int nb[maxn];
    int len;
    
    
    void read()
    {
        scanf("%s", s);
        for (int i = 0; s[i]; i++) b[i + 1] = s[i] - '0';
        nb[1] = b[1] * 10 + b[2]; for (int i = 2; s[i]; i++) nb[i] = s[i] - '0';
    }
    
    void init()
    {
        len = strlen(s);
        memset(flag, 0, sizeof flag);
    }
    
    bool check1()
    {
        for (int i = 1; i <= (len + 1) / 2; i++)
        {
            if (sum[i] % 2 == 0) a[i] = sum[i] / 2, a[len - i + 1] = sum[i] / 2;
            else a[i] = sum[i] / 2 + 1, a[len - i + 1] = sum[i] - a[i];
        }
    
        for (int i = 1; i <= len; i++) tmpa[i] = a[i];
        for (int i = 1; i <= len; i++) tmpb[i] = a[len - i + 1];
    
        int k = 0;
        for (int i = 1; i <= len; i++)
        {
            ans[i] = (tmpa[i] + tmpb[i] + k) % 10;
            k = (tmpa[i] + tmpb[i] + k) / 10;
        }
    
        for (int i = 1; i <= len; i++)
        if (b[len - i + 1] != ans[i]) return 0;
        return 1;
    }
    
    bool work1()
    {
        bool fail = 0; init();
    
        for (int i = len; i >= len / 2 + 1; i--)
        {
            int id_now = i, id_pre = len - i + 1;
    
            if (i == len)
            {
                if (b[i] == 0) { fail = 1; break; }
    
                sum[id_now] = b[id_now]; sum[id_pre] = b[id_now];
                flag[id_now] = 0; flag[id_pre] = 0;
    
                if (b[id_now] == b[id_pre]) flag[id_pre + 1] = 0;
                else if (b[id_now] + 1 == b[id_pre]) flag[id_pre + 1] = 1;
                else { fail = 1; break; }
            }
    
            else
            {
                int num_now, num_pre;
                num_now = b[id_now] - flag[id_now + 1];
    
                if (num_now == 9)
                {
                    if (b[id_pre] == 9)
                    {
                        sum[id_now] = 9; sum[id_pre] = 9;
                        flag[id_pre + 1] = 0;
                    }
                    else if (b[id_pre] == 0)
                    {
                        sum[id_now] = 9; sum[id_pre] = 9;
                        flag[id_pre + 1] = 1;
                    }
                    else { fail = 1; break; }
                }
                else if (b[id_now] == 0 && flag[id_now + 1])
                {
                    if (b[id_pre] == 9 || b[id_pre] == 0)
                    {
                        flag[id_now] = 1;
                        if (b[id_pre] == 0) flag[id_pre + 1] = 1;
                        sum[id_now] = 9;
                        sum[id_pre] = 9;
                    }
                    else { fail = 1; break; }
                }
                else
                {
                    num_now = num_now + flag[id_pre] * 10;
                    num_pre = b[id_pre] + flag[id_pre] * 10;
    
                    if (num_now == num_pre)
                    {
                        flag[id_pre + 1] = 0;
                        sum[id_now] = num_now; sum[id_pre] = num_now;
                        if (num_now >= 10) flag[id_now] = 1;
                    }
    
                    else if (num_now + 1 == num_pre)
                    {
                        flag[id_pre + 1] = 1;
                        sum[id_now] = num_now; sum[id_pre] = num_now;
                        if (num_now >= 10) flag[id_now] = 1;
                    }
                    else { fail = 1; break; }
                }
            }
            if (id_now == id_pre&&sum[id_pre] % 2 != 0) { fail = 1; break; }
        }
    
        if (!check1()) fail = 1;
    
        return fail;
    }
    
    bool check2()
    {
        memset(tmpa, 0, sizeof tmpa);
        memset(tmpb, 0, sizeof tmpb);
    
        for (int i = 1; i <= (len + 1) / 2; i++)
        {
            if (sum[i] % 2 == 0) a[i] = sum[i] / 2, a[len - i + 1] = sum[i] / 2;
            else a[i] = sum[i] / 2 + 1, a[len - i + 1] = sum[i] - a[i];
        }
    
        for (int i = 1; i <= len; i++) tmpa[i] = a[i];
        for (int i = 1; i <= len; i++) tmpb[i] = a[len - i + 1];
    
        int k = 0;
        len++;
        for (int i = 1; i <= len; i++)
        {
            ans[i] = (tmpa[i] + tmpb[i] + k) % 10;
            k = (tmpa[i] + tmpb[i] + k) / 10;
        }
    
        for (int i = 1; i <= len; i++)
        if (b[len - i + 1] != ans[i]) return 0;
        return 1;
    }
    
    bool work2()
    {
        bool fail = 0; init();
    
        len--;
    
        for (int i = len; i >= len / 2 + 1; i--)
        {
            int id_now = i, id_pre = len - i + 1;
    
            if (i == len)
            {
                sum[id_now] = 10 + nb[id_now]; sum[id_pre] = 10 + nb[id_now];
                flag[id_now] = 1; flag[id_pre] = 1;
    
                if (nb[id_now] + 10 == nb[id_pre]) flag[id_pre + 1] = 0;
                else if (nb[id_now] + 10 + 1 == nb[id_pre]) flag[id_pre + 1] = 1;
                else { fail = 1; break; }
            }
    
            else
            {
                int num_now, num_pre;
                num_now = nb[id_now] - flag[id_now + 1];
    
                if (num_now == 9)
                {
                    if (nb[id_pre] == 9)
                    {
                        sum[id_now] = 9; sum[id_pre] = 9;
                        flag[id_pre + 1] = 0;
                    }
                    else if (nb[id_pre] == 0)
                    {
                        sum[id_now] = 9; sum[id_pre] = 9;
                        flag[id_pre + 1] = 1;
                    }
                    else { fail = 1; break; }
                }
                else if (nb[id_now] == 0 && flag[id_now + 1])
                {
                    if (nb[id_pre] == 9 || nb[id_pre] == 0)
                    {
                        flag[id_now] = 1;
                        if (nb[id_pre] == 0) flag[id_pre + 1] = 1;
                        sum[id_now] = 9;
                        sum[id_pre] = 9;
                    }
                    else { fail = 1; break; }
                }
                else
                {
                    num_now = num_now + flag[id_pre] * 10;
                    num_pre = nb[id_pre] + flag[id_pre] * 10;
    
                    if (num_now == num_pre)
                    {
                        flag[id_pre + 1] = 0;
                        sum[id_now] = num_now; sum[id_pre] = num_now;
                        if (num_now >= 10) flag[id_now] = 1;
                    }
    
                    else if (num_now + 1 == num_pre)
                    {
                        flag[id_pre + 1] = 1;
                        sum[id_now] = num_now; sum[id_pre] = num_now;
                        if (num_now >= 10) flag[id_now] = 1;
                    }
                    else { fail = 1; break; }
                }
            }
            if (id_now == id_pre&&sum[id_pre] % 2 != 0) { fail = 1; break; }
        }
    
        if (!check2()) fail = 1;
    
        return fail;
    }
    
    
    int main()
    {
        read();
        init();
        if (!work1())
        {
            for (int i = 1; i <= len; i++) printf("%d", a[i]);
            printf("
    ");
        }
        else
        {
            if (b[1] == 1)
            {
                if (!work2())
                {
                    for (int i = 1; i <= len - 1; i++) printf("%d", a[i]);
                    printf("
    ");
                }
                else { printf("0
    "); }
            }
            else { printf("0
    "); }
        }
        return 0;
    }
  • 相关阅读:
    【Java】快速排序、归并排序、堆排序、基数排序实现总结
    【Java】二分查找、插值查找、斐波那契查找的实现,及分析
    【Java】Java实现常见的七种排序
    【C】常见的排序
    栈,迷宫问题
    海量数据处理问题
    【C】 布隆过滤器BloomFilter
    哈希变形---位图
    C实现Hash表,链式结构
    C实现Hash表,开放定址法
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5188489.html
Copyright © 2020-2023  润新知