SRM 533 DIV2

很长时间没做TC了,再说自己做的也确实相当少,所以不是很熟+思路来的比较慢所以做得不是多么好,只做出了250pt,500pt的思路对还没敲完就结束了。话说TC,CF什么的真的很锻炼人的思维能力可就是老在晚上举行,所以弄得....

250pt就是求一个

x + z = d;

2*x + 4*y + 4*z = f;

y  + z = t;推出公式计算即可:

500pt

题意:

给定你一个序列,里面含有一个-1其余都是非负数另开一个栈,按如下操作进行:

遇到大于0的进栈,遇到0取栈顶两个元素相加再放进栈,最后得到栈顶的元素为wantresult.

给出序列和wantresult,问-1这个位置如果是0就输出0,如果是非负数就输出非负数,否则输出-1

思路:
模拟,就是先将-1当做0处理看是否能够得到wantresult,如果不能再将-1当做1处理,我在这里直接就看了最后得到的栈顶元素是否等于wantresult,结果跑系统数据时错了,原因是可能-1这个位置本身去什么(除去0)都不会对栈顶元素造成影响,所以再把-1当做2放进去,检查一下两种情况下栈顶元素是否相同,若相同则输出-0;否则通过1得到的结果处理输出非负数。

View Code
#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <queue>

#include <stack>

#include <set>

#include <map>

#include <string>



#define CL(a,num) memset((a),(num),sizeof(a))

#define iabs(x)  ((x) > 0 ? (x) : -(x))

#define Min(a,b) (a) > (b)? (b):(a)

#define Max(a,b) (a) > (b)? (a):(b)



#define maxn 50004

#define N 207

#define M 507

#define ll long long

#define inf 0x7f7f7f7f

#define MOD 100000007

#define lc l,m,rt<<1

#define rc m + 1,r,rt<<1|1

#define pi acos(-1.0)

using namespace std;



stack<ll> st1,st2,st3;

class Suminator

{

    public:



    int findMissing(vector <int> program, int wantedResult)

    {

        vector<ll>p; int i;

        int sz = program.size();

        int idx = 0;

        for (int i = 0; i < sz; ++i)

        {

            if (program[i] == -1) idx = i;

            p.push_back(program[i]);

        }

        for (i = 0; i < 200; ++i)

        {

            st1.push(0); st2.push(0); st3.push(0);

        }

        p[idx] = 0;

        for (i = 0; i < sz; ++i)

        {

            if (p[i] == 0)

            {

                ll a = st1.top(); st1.pop();

                ll b = st1.top(); st1.pop();

                st1.push(a + b);

            }

            else st1.push(p[i]);

        }

        if (st1.top() == (ll)wantedResult) return 0;



        p[idx] = 1;

        for (i = 0; i < sz; ++i)

        {

            if (p[i] == 0)

            {

                ll a = st2.top(); st2.pop();

                ll b = st2.top(); st2.pop();

                st2.push(a + b);

            }

            else st2.push(p[i]);

        }



        p[idx] = 2;

        for (i = 0; i < sz; ++i)

        {

            if (p[i] == 0)

            {

                ll a = st3.top(); st3.pop();

                ll b = st3.top(); st3.pop();

                st3.push(a + b);

            }

            else st3.push(p[i]);

        }



        if (st2.top() == st3.top()) return -1;

        ll ans = (ll)wantedResult - st2.top() + 1ll;

        if (ans >= 1ll) return (int)(ans);

        else return -1;

    }

};

1000pt没看。。

你可能感兴趣的:(div)