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没看。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值