ecna2017-Game of Throwns

这题就是给你一个标号为0-n-1的环,然后给你M个操作,操作有两种,一种是直接给一个数,这数的正负代表我当前向前(向后)仍了xx个位置的球,或者给你一个撤销操作表示为 undo m,表示撤销最近的M个操作

这题是个标准的栈模拟,但是我忘记了两个问题,由于这里要判断undo,因此是字符串输入,这样我们需要判断是否是undo并且是否为负数,并且最后可能出现负数,需要用同余模减法ans=(ans%mod+mod)%mod

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std;
char a[5000000];
int main()
{
    int n,m;
    int len,f,tmp;
    int ss;
    int nu;
    stack<int>p;
    while(~scanf("%d%d",&n,&m))
    {
        int mod=1;
        for (int i=1; mod<=10000; i++)
        {
            mod=mod*n;
        }
        for (int i=1; i<=m; i++)
        {
            scanf("%s",a);
            if(a[0]=='u')
            {
                scanf("%d",&nu);
                while(!p.empty() && nu>0)
                {
                    //cout<<p.top()<<endl;
                    p.pop();
                    nu--;
                }
            }
            else
            {
                len=strlen(a);
                f=1;
                ss=0;
                //cout<<a<<endl;
                if (a[0]!='-')
                {
                    while(len!=0)
                    {
                        ss+=(a[len-1]-'0')*f;
                        f*=10;
                        len--;
                    }
                    p.push(ss);
                }
                else
                {
                    while(len!=1)
                    {
                        ss-=(a[len-1]-'0')*f;
                        f*=10;
                        len--;
                    }
                    p.push(ss);
                }
            }
        }
        int ans=0;
        while(!p.empty())
        {
            int tp=p.top();
            p.pop();
            ans+=tp;
        }
        printf("%d\n",(ans%n+n)%n);
    }
    return 0;
}

 

posted @ 2018-09-03 18:40  bluefly-hrbust  阅读(144)  评论(0编辑  收藏  举报