POJ 1472 Instant Complexity

首先不得不说我的英语水平太差,还有就是对题目很不敏感,我竟然看了好久没有看懂题意是什么,然后在网上搜的时候也没有发现解析题意的,然后又看了几遍才看懂的!

题目大致意思:给你一段程序,让你求出执行这段程序的时间复杂度,LOOP m代表循环m次,OP m代表的是对加m,end代表是一个LOOP循环语句的结束,最后一个END代表的是程序的结束!

昨天晚上写的时候题目没有分析完全,然后就是写的代码有bug,然后今天又写了一遍就过了,但是毕竟是看着测试数据之后才找到bug然后又写的代码,没有一点成就感啊!我用的是栈的方法写的,下面是代码!

#include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
#include<stack>
using namespace std;
typedef struct Stack
{
	int sign;//标记是loop还是op
	char s[10];//代表的是数据
	int stage;//代表的是等级的
}rr;
Stack  point[1000];
typedef struct fun
{
	int n,sum;//n的个数,系数的大小的e
	int range;//代表可以表示的范围的
}qq;
fun a[1000];
int len;
int tans(char *s)
{
	int len,i,sum=0;
	len=strlen(s);
	for(i=0; i<len; i++)
		sum=sum*10+s[i]-'0';
	return sum;
}
int cmp(const void *a,const void *b)
{
	fun *c=(fun *)a;
	fun *d=(fun *)b;
	return d->n-c->n;
}
int Scan()
{
     int cout=0,rrtt=0;
	 int i,j,k,pre;
	 i=0;
	 j=0;
	 char s[10];
	 stack<int>q;//建立栈的
	 while(scanf("%s",s))
	 {
          if(rrtt==0  && strcmp(s,"END")==0)
			  break;//就是所有输入和输出已经结束了
		  if(strcmp(s,"LOOP")==0)
		  {
              point[i].sign=0;//
			  scanf("%s",point[i].s);
			  cout++;
			  rrtt++;
			  q.push(i);
			  point[i].stage=cout;//代表的是第几个循环的
			  i++;
		  }
		  if(strcmp(s,"OP")==0)
		  {
			  point[i].sign=1;
              scanf("%s",point[i].s);
//			  point[i].stage=-1;//这个其实是没有意思的
			  q.push(i);
			  i++;
		  }
		  if(strcmp(s,"END")==0)
		  {
			  while(true)//就是不为空
			  {
			     pre=q.top();
			     q.pop();
					 if(point[pre].sign==0)//代表end的那个结束了
					 {
							 for(k=0; k<j; k++)
							 {
								 if(point[pre].stage<=a[k].range)
								 {
									 if(strcmp(point[pre].s,"n")==0)
									 {
										 a[k].n++;
									 }
									 else
										 a[k].sum*=tans(point[pre].s);
								 }
							 }
							 rrtt--;
						   break;
					 }
					 else
					 {
						 if(strcmp(point[pre].s,"n")==0)
						 {
							 a[j].n=1;
							 a[j].sum=1;
							 a[j].range=cout;//记录当前的循环层数的
						 }
						 else
						 {
							 a[j].n=0;
							 a[j].sum=tans(point[pre].s);
							 a[j].range=cout;
						 }
						 j++;
					 }
				 }
		  }
		  
	 }
	 while(q.empty()==0)//不空的时候
		  {
		         pre=q.top();
			     q.pop();
                         if(strcmp(point[pre].s,"n")==0)
						 {
							 a[j].n=1;
							 a[j].sum=1;
							 a[j].range=cout;
						 }
						 else
						 {
							 a[j].n=0;
							 a[j].sum=tans(point[pre].s);
							 a[j].range=cout;
						 }
						 j++;
		  }
	 return j;
}
int main()
{
	int T,i,j;
	scanf("%d",&T);
	for(int l=1; l<=T; l++)
	{
		j=Scan();
		qsort(a,j,sizeof(fun),cmp);//对于n的数进行降序排列的
		for(i=0; i<j-1; i++)
		{
			if(a[i].n==a[i+1].n)
			{
				a[i+1].sum+=a[i].sum;
				a[i].sum=0;//将其系数换为0
			}
		} 
		printf("Program #%d\n",l);
		printf("Runtime = ");
		int sign=0;
        for(i=0; i<j; i++)
		{
			if(a[i].sum==0)
				continue;
			sign++;//代表已经输出了
			if(sign>1)
				printf("+");//多项式的不是第一项了
			if(a[i].sum!=1 || (a[i].sum==1 && a[i].n==0))
			  printf("%d",a[i].sum);
			if(a[i].sum!=1 && a[i].n!=0)
				printf("*");
			if(a[i].n==1)
				printf("n");
			else if(a[i].n>1)
				printf("n^%d",a[i].n);
		}
		if(sign==0)
			printf("0");
		printf("\n\n");
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定的小Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值