提交记录 22071


用户 题目 状态 得分 用时 内存 语言 代码长度
LYRT_Subway noip17b. 【NOIP2017】时间复杂度 Accepted 100 541.5 us 1648 KB C++ 3.34 KB
提交时间 评测时间
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.
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1311.19 us1 MB + 624 KBAcceptedScore: 10

Testcase #2231.37 us1 MB + 624 KBAcceptedScore: 10

Testcase #3345.72 us1 MB + 624 KBAcceptedScore: 10

Testcase #4280.79 us1 MB + 624 KBAcceptedScore: 10

Testcase #5286.86 us1 MB + 624 KBAcceptedScore: 10

Testcase #6242.08 us1 MB + 624 KBAcceptedScore: 10

Testcase #7291.08 us1 MB + 624 KBAcceptedScore: 10

Testcase #8382.99 us1 MB + 624 KBAcceptedScore: 10

Testcase #9376.05 us1 MB + 624 KBAcceptedScore: 10

Testcase #10541.5 us1 MB + 624 KBAcceptedScore: 10


Judge Duck Online | 评测鸭在线
Server Time: 2024-12-05 10:16:17 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠