zoukankan      html  css  js  c++  java
  • B3300 [USACO2011 Feb]Best Parenthesis 模拟

    这是我今天遇到最奇怪的问题,希望有人帮我解释一下。。。

    一开始我能得90分:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i--)
    #define clean(a) memset(a,0,sizeof(a))
    typedef long long ll;
    const int INF = 1 << 30;
    const ll mod = 12345678910;
    
    typedef double db;
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(), c < '0' || c > '9')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(), c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op) x = -x;
    }
    template <class T>
    void write(T x)
    {
        if(x < 0) putchar('-'), x = -x;
        if(x >= 10) write(x / 10);
        putchar('0' + x % 10);
    }
    ll n,s = 0;
    ll p[50000],x,ans = 0;
    ll num = 0;
    int main()
    {
        read(n);
        duke(i,1,n)
        {
            read(x);
            if(x == 0)
            {
                p[++num] = x;
            }
            else
            {
                s = 0;
                while (p[num] != 0)
                {
                    s += p[num];
                    s = s % mod;
                    num--;
                }
                if(s == 0)
                {
                    p[num] = 1;
                }
                else
                {
                    p[num] = s * 2 % mod;
                }
            }
        }
        ll tot = 0;
        duke(i,1,num)
        {
    //        cout<<p[i]<<endl;
            tot += p[i];
            tot %= mod;
        }
        write(tot);
        return 0;
    }

    然而并不知道为什么。。。找了个题解,发现没啥区别,然后就改了一下num的顺序,结果变成80,最神奇的是之前错的那个点对了,然而另两个点错了。。。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i--)
    #define clean(a) memset(a,0,sizeof(a))
    typedef long long ll;
    const int INF = 1 << 30;
    const ll mod = 12345678910;
    typedef double db;
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(), c < '0' || c > '9')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(), c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op) x = -x;
    }
    template <class T>
    void write(T x)
    {
        if(x < 0) putchar('-'), x = -x;
        if(x >= 10) write(x / 10);
        putchar('0' + x % 10);
    }
    ll n,s = 0;
    ll p[50000],x,ans = 0;
    ll num = 1;
    int main()
    {
    //    freopen("1.in","r",stdin);
    //    freopen("1.out","w",stdout);
        read(n);
        p[0] = 0;
        p[1] = 0;
        clean(p);
        duke(i,1,n)
        {
            read(x);
            if(x == 0)
            {
                p[num++] = x;
            }
            if(x == 1)
            {
                s = 0;
                while (p[num - 1] != 0)
                {
                    s += p[num - 1];
                    s = s % mod;
                    num--;
                }
                /*if(i == n)
                {
                    printf("%lld
    ",s);
                    cout<<num - 1<<endl;
                }*/
                if(s == 0)
                {
                    p[num - 1] = 1;
                }
                else
                {
                    p[num - 1] = (s * 2) % mod;
                }
                /*if(i == n)
                {
                    printf("%lld
    ",p[num - 1]);
                    cout<<num - 1<<endl;
                }*/
            }
        }
        ll tot = 0;
        duke(i,1,num - 1)
        {
    //        cout<<p[i]<<endl;
            tot += p[i];
            tot %= mod;
        }
        write(tot);
        return 0;
    }

    蒙了,然后一点点de,到最后也没看出来。通过一些手段发现了是算和的时候出问题了,然而并不知道为什么。。。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i--)
    #define clean(a) memset(a,0,sizeof(a))
    typedef long long ll;
    const int INF = 1 << 30;
    const ll mod = 12345678910;
    typedef double db;
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(), c < '0' || c > '9')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(), c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op) x = -x;
    }
    template <class T>
    void write(T x)
    {
        if(x < 0) putchar('-'), x = -x;
        if(x >= 10) write(x / 10);
        putchar('0' + x % 10);
    }
    ll n,s = 0;
    ll p[50000],x,ans = 0;
    ll num = 1;
    int main()
    {
    //    freopen("1.in","r",stdin);
    //    freopen("1.out","w",stdout);
        read(n);
        p[0] = 0;
        p[1] = 0;
        clean(p);
        duke(i,1,n)
        {
            read(x);
            if(x == 0)
            {
                p[num] = x;
                num++;
            }
            if(x == 1)
            {
                s = 0;
                while (p[num - 1] != 0)
                {
                    s += p[num - 1];
                    s = s % mod;
                    num--;
                }
                if(s == 0)
                {
                    p[num - 1] = 1;
                }
                else
                {
                    p[num - 1] = (s * 2) % mod;
                }
            }
        }
        for(int i=2;i<num;i++)
        {
    //        cout<<p[i]<<endl;
            p[1] += p[i];
            p[1] = p[1] % 12345678910;
        }
        cout<<p[1];
        return 0;
    }
    /*
    6
    0
    0
    1
    1
    0
    1
    ( ( ) ) ( )
    0 0 1 2 0 1 
    */

    就是把

    ll tot = 0;
        duke(i,1,num - 1)
        {
    //        cout<<p[i]<<endl;
            tot += p[i];
            tot %= mod;
        }
        write(tot);

    换成

    for(int i=2;i<num;i++)
        {
    //        cout<<p[i]<<endl;
            p[1] += p[i];
            p[1] = p[1] % 12345678910;
        }
        cout<<p[1];

    就对了!!!震惊!!!为什么?求大佬解释。。。

  • 相关阅读:
    JAVAEE框架搭建所需的配置文件大全
    JPA之hibernate例子+总结
    NtDuplicateObject小解读
    黑窗口输入确定数字弹MessageBox(VirtualProtect())
    内存理解之简单的内存修改器
    注入理解之挂起线程
    银行家算法
    ReflectiveLoader分析(远程线程注入 PE修正)
    Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法
    了解RabbitMQ
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9501902.html
Copyright © 2011-2022 走看看