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; }
有不懂欢迎咨询
QQ:1326487164(添加时记得备注)