代码改变世界

srm540 div1

2012-04-13 02:43  macaroniz  阅读(138)  评论(0)    收藏  举报

250pt

很简单,让a1作为方程的自由元,然后判断即可,但是细节很多,很考察代码能力。

写的有点丑,不想改了。

class ImportantSequence
{
public:
    long long maxx(long long a,long long b)
    {
        return a > b ? a : b;
    }
    long long minx(long long a,long long b)
    {
        return a < b ? a : b;
    }
    long long maxx2(long long a,long long b)
    {
        return a > b ? a : b;
    }
    long long minx2(long long a,long long b)
    {
        if(a == -1) return b;
        if(b == -1) return a;
        return a < b ? a : b;
    }

    int getCount(vector <int> B, string operators)
    {
        long long k = 1,c = 0;
        vector<long long> larr,rarr;
        for(int i = 0;i < operators.length();i++)
        {
            if(operators[i] == '+')
            {
                k = -k;
                c = B[i] - c;
            }
            else
            {
                c = c - B[i];
            }
            //printf("k:%I64d c:%I64d\n",k,c);
            if(k > 0)
            {
                if(c % k != 0)
                    larr.push_back(maxx(1,(long long)(-1.0*c/k)));
                else larr.push_back(maxx(1,(long long)(-1*c/k+1)));
                rarr.push_back(-1);
            }
            else if(k < 0)
            {
                larr.push_back(1);
                if(c % k != 0)
                    rarr.push_back(maxx(0,(long long)(-1.0*c/k)));
                else rarr.push_back(maxx(0,(long long)(-1*c/k-1)));
                //printf("2:%I64d\n",(long long)(-1.0*c/k));
            }

        }
        long long maxl = 1,minr = -1;
        for(int i = 0;i < larr.size();i++)
        {
            //printf("%I64d %I64d\n",larr[i],rarr[i]);
            maxl = maxx2(larr[i],maxl);
            minr = minx2(rarr[i],minr);
        }
        if(minr == -1)  return -1;
        if(maxl > minr) return 0;
        return (int)(minr - maxl+1);
    }
};