提交记录 22071
提交时间 |
评测时间 |
2024-08-07 11:00:54 |
2024-08-07 11:00:58 |
#include<bits/stdc++.h>
using namespace std;
int ans[430];//ans数组存放每一段程序的最终结果 -1表示ERR 0表示No 1表示Yes,默认做题答案为No(毕竟错的概率肯定更大吧嘿嘿嘿
int interchange(string a,int b)//interchange函数 将string型的数字转换为int型
{
int ans=0,i=b;//从想读那一位开始读(为了判断输入的O(n^w),一般b==0||b==4
if(a[i]=='n')//如果读到n 则表示循环的头或者尾用变量n表示
{
return 4011;//返回一个“远大于100”的数
}
while(a[i]!='\0')//普通的string转int 一直读数据直到为空('\0')
{
if(a[i]==')')//特判 如果在读O(n^w)的时候会用到
{
return ans;//直接返回ans
}
ans=ans*10+(a[i]-'0');//一看就明白的string转int
i++;//读下一位
}
return ans;//返回原字符串想表达的数字
}
struct sentence{//stc语句 bl变量 head_F循环开始 nail_F循环结束
char stc,bl;
int head,nail,if_can_run;//if_can_run 标记上一层循环是否能运行
string head_F,nail_F;
}s[103];//默认存到s数组里面,如果放到循环里面定义编译会报错,后来发现如果在这里定义就不会报错,也不会影响结果
int main(){
int t;//共有t个程序
cin>>t;
for(int i=0;i<t;i++)
{
int L,w=0,real_w=0,floor=0,a[411000]={0},tmp_w=0;
//程序内有L条语句 floor表示循环层数 (以主函数为0层)
//a数组标记是否使用过该变量名
//
//w为猜的复杂度 real_w为实际复杂度 tmp_w为当前循环里复杂度
string O;//以字符串形式输入O,即猜测的复杂度
cin>>L;
cin>>O;
if(O[2]=='1') w=0;//如果读到1那么猜的复杂度就是n^0
else w=interchange(O,4);//否则从O[4]开始读起读数字(数字可能不止一位)
for(int j=0;j<L;j++)
{
if(floor==0)//如果在底层循环
{
s[floor].if_can_run=1;//标记从这一层开始的所有循环都能执行
tmp_w=0;//将当前的复杂度重置为O(1) 即w=0
}
else
{
s[floor].if_can_run=s[floor-1].if_can_run;//如果不在底层循环则询问上一层循环是否能正常运行
}
cin>>s[floor].stc;//输入当前行数的语句类型 E为终止循环 F为开始循环 其它字母报错
if(s[floor].stc=='E')//如果是E语句
{
if(tmp_w>real_w)//若上述若干个F循环的复杂度 大于 之前存入的最大复杂度
{
real_w=tmp_w;////更新实际的复杂度
}
a[s[floor-1].bl]=0;//将上一循环的变量标记为已使用完,后续再使用则不报错
if(s[floor-1].if_can_run==1&&s[floor-1].head<s[floor-1].nail&&s[floor-1].nail==4011)
{
tmp_w--;
}//如果上一层循环可以运行 而且对O(n^w)有贡献,则将当前的复杂度-1
floor--;//最后将栈顶往下移一位
if(floor<=-1)//如果小于等于-1的话,说明E比F的层数要多
{
ans[i]=-1;//则报错
floor=0;//将层数复原为0,保证后续程序可以正常运行(不然数组则会读取a[-1]之类的变量报错导致Runtime Error)
}
}
else if(s[floor].stc=='F')//如果是F语句
{
cin>>s[floor].bl>>s[floor].head_F>>s[floor].nail_F;//输入本次循环所用的变量,变量初始值以及终止值
s[floor].head=interchange(s[floor].head_F,0);
s[floor].nail=interchange(s[floor].nail_F,0);//将输入的字符串转换为int型方便读取
if(s[floor].head==4011||s[floor].nail==4011)//如果头或者尾为4011则说明有n的存在,判断n变量已被使用并标记
{
a['n']==1;//※实际上测试点并不会出现循环变量名为n的情况(题目也说了循环变量不会定义为n)
}
if(a[s[floor].bl]!=0)//如果在上列循环中已使用过这一变量名
{
ans[i]=-1;//则报错
}
a[s[floor].bl]=1;
if(s[floor].head<=s[floor].nail&&s[floor].if_can_run==1&&ans[i]!=-1)//判断头是否小于尾且该程序是否能运行
{
if(s[floor].head<s[floor].nail&&s[floor].nail==4011)//如果头小于尾 而且尾为n
{
tmp_w++;//那么就对复杂度有贡献
if(tmp_w>real_w)//如果当前复杂度比之前存的要大
{
real_w=tmp_w;//那么更新
}
}
}
else//如果程序不能运行(即尾小于头这种情况)
{
s[floor].if_can_run=0;//则标记后续的循环不可执行,不计算复杂度
}
floor++; //栈顶上移,标记进入更深的一层循环
}
else//既不是E语句也不是F语句
{
ans[i]=-1;//报错ERR
}
if(floor<=-1)//如果循环层数小于等于-1
{
ans[i]=-1;//报错ERR
floor=0;//为保证下列程序可以继续运行,重置循环层数
}
}
if(floor!=0)//如果最终循环层数不为0,则表示E过多或过少
{
ans[i]=-1;//报错ERR
}
if(w==real_w&&ans[i]!=-1)//如果猜的复杂度和实际复杂度相等,而且没有报错
{
ans[i]=1;//那就算你对咯
}
}
for(int i=0;i<t;i++)//for循环输出答案
{
if(ans[i]==1)
{
cout<<"Yes\n";//1则为Yes
}
if(ans[i]==0)
{
cout<<"No\n";//0则为No
}
if(ans[i]==-1)
{
cout<<"ERR\n";//-1则为ERR
}
}
return 0;//All Over ~ Thanks for your watching.
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Testcase #1 | 311.19 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #2 | 231.37 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #3 | 345.72 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #4 | 280.79 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #5 | 286.86 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #6 | 242.08 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #7 | 291.08 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #8 | 382.99 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #9 | 376.05 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Testcase #10 | 541.5 us | 1 MB + 624 KB | Accepted | Score: 10 | 显示更多 |
Judge Duck Online | 评测鸭在线
Server Time: 2024-12-05 10:16:17 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠