三部曲二(基本算法、动态规划、搜索)-1004-Instant Complexity
Instant Complexity
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 7
Generally, one determines the run-time of an algorithm in relation to the `size' n of the input, which could be the number of objects to be sorted, the number of points in a given polygon, and so on. Since determining a formula dependent on n for the run-time of an algorithm is no easy task, it would be great if this could be automated. Unfortunately, this is not possible in general, but in this problem we will consider programs of a very simple nature, for which it is possible. Our programs are built according to the following rules (given in BNF), where < number > can be any non-negative integer:
< Program > ::= "BEGIN" < Statementlist > "END"
< Statementlist > ::= < Statement > | < Statement > < Statementlist >
< Statement > ::= < LOOP-Statement > | < OP-Statement >
< LOOP-Statement > ::= < LOOP-Header > < Statementlist > "END"
< LOOP-Header > ::= "LOOP" < number > | "LOOP n"
< OP-Statement > ::= "OP" < number >
The run-time of such a program can be computed as follows: the execution of an OP-statement costs as many time-units as its parameter specifies. The statement list enclosed by a LOOP-statement is executed as many times as the parameter of the statement indicates, i.e., the given constant number of times, if a number is given, and n times, if n is given. The run-time of a statement list is the sum of the times of its constituent parts. The total run-time therefore generally depends on n.
Output a blank line after each test case.
LOOP n
OP 4
LOOP 3
LOOP n
OP 1
END
OP 2
END
OP 1
END
OP 17
END
OP 1997 LOOP n LOOP n OP 1 END END
END
Runtime = 3*n^2+11*n+17
Program #2
Runtime = n^2+1997
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std; char cmd[][];
int mul[]; struct factor
{
int coef,time;
}fac[]; bool cmp(const factor f1,const factor f2)
{
return f1.time>f2.time||f1.time==f2.time&&f1.coef>f2.time;
} int main()
{
// freopen("in.txt","r",stdin);
int T,cas=;
scanf("%d",&T);
while(T--)
{
cas++;
int hn=,tn=,tot=,i,j,k,rear1=,rear2=;
memset(fac,,sizeof(fac));
memset(mul,,sizeof(mul));
while(hn!=tn) //当左右括号数相等时输入结束
{
scanf("%s",cmd[tot]);
if(strcmp(cmd[tot],"LOOP")==)
hn++;
else if(strcmp(cmd[tot],"END")==)
tn++;
tot++;
}
// for(i=0;i<tot;i++)
// cout<<cmd[i]<<endl;
for(i=;i<tot;i++)
{
if(cmd[i][]=='O')
{
if(cmd[i+][]=='n')
{
fac[rear1].coef=;
fac[rear1].time=;
rear1++;
}
else
{
int tmp=;
for(j=;j<strlen(cmd[i+]);j++)
tmp=tmp*+(cmd[i+][j]-'');
fac[rear1++].coef=tmp;
// cout<<tmp<<endl;
}
}
else if(cmd[i][]=='L')
{
fac[rear1++].coef=-; //作为分界线,表明括号的开始
if(cmd[i+][]=='n')
mul[rear2++]=-; //以-1代表乘数是n
else
{
int tmp=;
for(j=;j<strlen(cmd[i+]);j++)
tmp=tmp*+(cmd[i+][j]-'');
mul[rear2++]=tmp;
// cout<<tmp<<endl;
}
}
else if(cmd[i][]=='E')
{
int t=rear1-;
rear2--;
while(fac[t].coef!=-&&t!=-)
{
t--;
}
for(j=t+;j<rear1-;j++)
{
if(fac[j].coef==)
continue;
for(k=j+;k<rear1;k++)
{
if(fac[k].coef==)
continue;
if(fac[j].time==fac[k].time) //合并同类项
{
fac[j].coef+=fac[k].coef;
fac[k].coef=;
fac[k].time=;
}
}
}
if(rear2==-) //表明运行到最后一个end了,跳出
break;
fac[t].coef=; //消除分界线
int m=mul[rear2];
if(m==-)
{
for(j=t+;j<rear1;j++)
{
if(fac[j].coef)
fac[j].time++;
}
}
else
{
for(j=t+;j<rear1;j++)
{
if(fac[j].coef)
fac[j].coef*=m;
}
}
}
}
sort(fac,fac+rear1,cmp);
// for(i=0;i<rear1;i++)
// cout<<fac[i].coef<<' '<<fac[i].time<<endl;
printf("Program #%d\n",cas);
printf("Runtime = ");
if(fac[].coef==)
{
printf("0\n\n");
continue;
}
for(i=;i<rear1;i++)
{
if(fac[i].time==&&fac[i].coef==)
break;
if(fac[i].coef==&&fac[i].time==)
printf("%d",fac[i].coef);
if(fac[i].coef>)
{
printf("%d",fac[i].coef);
if(fac[i].time>)
printf("*");
}
if(fac[i].coef>&&fac[i].time>)
{
printf("n");
if(fac[i].time>)
printf("^%d",fac[i].time);
}
if(fac[i+].coef!=)
printf("+");
}
printf("\n\n");
}
return ;
}
三部曲二(基本算法、动态规划、搜索)-1004-Instant Complexity的更多相关文章
- LeetCode初级算法--动态规划01:爬楼梯
LeetCode初级算法--动态规划01:爬楼梯 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- 算法-动态规划 Dynamic Programming--从菜鸟到老鸟
算法-动态规划 Dynamic Programming--从菜鸟到老鸟 版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/u013309870/ar ...
- LeetCode探索初级算法 - 动态规划
LeetCode探索初级算法 - 动态规划 今天在LeetCode上做了几个简单的动态规划的题目,也算是对动态规划有个基本的了解了.现在对动态规划这个算法做一个简单的总结. 什么是动态规划 动态规划英 ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- python基础(9)--递归、二叉算法、多维数组、正则表达式
1.递归 在函数内部,可以调其他函数,如果一个函数在内部调用它本身,这个函数就是递归函数.递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于裂解 递归算法解决问题的特点: 1)递归是 ...
- hihocoder#1098 : 最小生成树二·Kruscal算法
#1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...
- Hihocoder #1098 : 最小生成树二·Kruskal算法 ( *【模板】 )
#1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
随机推荐
- .getClass();
Java的每个类都带有一个运行时类对象,该Class对象中保存了创建对象所需的所有信息.可以用.class返回此 Object 的运行时类Class对象,也可以用getClass()获得.获得此对象后 ...
- plsql和oracle错误记录
昨天oracle密码搞忘记了,根据网上方法弄了不管用,索性直接删掉数据库,然后重建,再次登陆的时候既然报错, 说我适配器错误,我靠,这是闹哪样,找了好多方法,都解决不了. 然后上班问一个oracle大 ...
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- 深入浅出设计模式——单例模式(Singleton Pattern)
模式动机对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号) ...
- 笔记本_Lenovo_G480
ZC: 这是 严g 的笔记本 1.进入 BIOS --> F2键 2.安装 WinServer2003时,蓝屏 2.1.Win2003的PE(不太明白 这里的PE指什么...)不支持 AHCI ...
- jQuery通过判断 checkbox 元素的 checked 属性,判断 checkbox是否被选中
jQuery设置复选框的属性<input type="checkbox"/> $("input").attr("checked" ...
- MUMmer 3使用方法
DNA和核苷酸的快速比对软件包,基于suffix tree 数据结构,快速.图形化.模块可用于其他软件.可进行大基因组比对.多对多基因组比对. The MUMmer Home Page The MUM ...
- Java远程调试代码不一致问题汇总
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 与SQL注入第一次相遇
sql注入的含义sql注入是将代码插入(拼接)到应用(用户)的输入参数中, 之后再将这些参数传递给后台的SQL服务器加以解析并执行的攻击, 总结起来就是攻击者将恶意代码拼接到sql语句并加以执行从而得 ...
- sanBox部署简介
参考资料:1 http://www.kaaproject.org/getting-started/ 此链接告诉我们部署sandbox的两种方法. 2 http://docs.kaaprojec ...