写了快一个半小时的模拟题。。。好恶心。。。(我不会说我是错了之后拿着数据调的)
说一些坑点吧。。
1.注意数是小于等于100的(PS:大家应该都知道。。但是我就是只用了第一个数字。。。orz).
2.在判定循环的时候如果第一个数为n并且第二个不是n不进入之后的循环,都是n继续但不计算次数,第一个比第二个大也不进入
就是这样
if(((t1>t2)&&q4[0]!='n')||(q3[0]=='n'&&q4[0]!='n'))
{
if(!ffl)ffl=tt;
}else
{
if((q4[0]=='n')&&(!ffl)&&(q3[0]!='n'))qw++;
}
3.要写好那个位置开始那个字符不能用。。开始我想的比较简单。我使用的map映射,用了两次。。可能比较麻烦。
下面代码。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
using namespace std;
map<string,int>M;
map<int,string>used;
int t,l,tt,qw,t1,t2,flag,pd1,pd2,qww,l1,l2,ffl;
char ss[12],q1[20],q2[20],q3[20],q4[20];
int main()
{
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d",&l);scanf("%s",ss);
flag=0,tt=0,qw=0,pd1=0,pd2=0,qww=0,ffl=0;M.clear();used.clear();
if(ss[2]=='1')pd1=1;
else
{
pd2=ss[4]-'0';
if(ss[5]<='9'&&ss[5]>='0')
{
pd2=pd2*10+ss[5]-'0';
if(ss[6]<='9'&&ss[6]>='0')pd2=pd2*10+ss[6]-'0';
}
}
for(int j=1;j<=l;j++)
{
scanf("%s",q1);
if(q1[0]=='E')
{
if(!tt)
{
flag=1;
}
M[used[tt]]=0;
if(tt==ffl)ffl=0;
tt--;
qww=max(qww,qw);
if(qw)qw--;
//if(!tt)M.clear();
}else
{
tt++;
scanf("%s",q2);scanf("%s",q3);scanf("%s",q4);
if(M[q2])
{
flag=1;
}
used[tt]=q2;
M[used[tt]]=1;l1=strlen(q3);l2=strlen(q4);t1=0,t2=0;
for(int qq=0;qq<l1;qq++)t1=t1*10+q3[qq]-'0';
for(int qq=0;qq<l2;qq++)t2=t2*10+q4[qq]-'0';
if(((t1>t2)&&q4[0]!='n')||(q3[0]=='n'&&q4[0]!='n'))
{
if(!ffl)ffl=tt;
}else
{
if((q4[0]=='n')&&(!ffl)&&(q3[0]!='n'))qw++;
}
}
}
if(flag==1)
{
printf("ERR\n");continue;
}
if(tt)
{
printf("ERR\n");continue;
}
if(pd1&&!qww)
{
printf("Yes\n");continue;
}
if(qww==pd2)
{
printf("Yes\n");continue;
}
printf("No\n");
}
return 0;
}