uva656 Optimal Programs
As you know, writing programs is often far from being easy. Things become even harder if your programs have to be as fast as possible. And sometimes there is reason for them to be. Many large programs such as operating systems or databases have ``bottlenecks'' - segments of code that get executed over and over again, and make up for a large portion of the total running time. Here it usually pays to rewrite that code portion in assembly language, since even small gains in running time will matter a lot if the code is executed billions of times.
In this problem we will consider the task of automating the generation of optimal assembly code. Given a function (as a series of input/output pairs), you are to come up with the shortest assembly program that computes this function.
The programs you produce will have to run on a stack based machine, that supports only five commands: ADD,SUB, MUL, DIV and DUP. The first four commands pop the two top elements from the stack and push their sum, difference, product or integer quotient1 , respectively, on the stack. The DUP command pushes an additional copy of the top-most stack element on the stack.
So if the commands are applied to a stack with the two top elements a and b (shown to the left), the resulting stacks look as follows:

At the beginning of the execution of a program, the stack will contain a single integer only: the input. At the end of the computation, the stack must also contain only one integer; this number is the result of the computation.
There are three cases in which the stack machine enters an error state:
- A DIV-command is executed, and the top-most element of the stack is 0.
- A ADD, SUB, MUL or DIV-command is executed when the stack contains only one element.
- An operation produces a value greater than 30000 in absolute value.
Input
The input consists of a series of function descriptions. Each description starts with a line containing a single integer n (
), the number of input/output pairs to follow. The following two lines contains nintegers each:
in the first line (all different), and
in the second line. The numbers will be no more than 30000 in absolute value.
The input is terminated by a test case starting with n = 0. This test case should not be processed.
Output
You are to find the shortest program that computes a function f , such that f(xi) = yi for all
. This implies that the program you output may not enter an error state if executed on the inputs xi(although it may enter an error state for other inputs). Consider only programs that have at most 10 statements.
For each function description, output first the number of the description. Then print out the se- quence of commands that make up the shortest program to compute the given function. If there is more than one such program, print the lexicographically smallest. If there is no program of at most 10 statements that computes the function, print the string ``Impossible''. If the shortest program consists of zero commands, print ``Empty sequence''.
Output a blank line after each test case.
Sample Input
4
1 2 3 4
0 -2 -6 -12
3
1 2 3
1 11 1998
1
1998
1998
0
Sample Output
Program 1
DUP DUP MUL SUB Program 2
Impossible Program 3
Empty sequence
Footnotes
- ... quotient1
- This corresponds to / applied to two integers in C/C++, and DIV in Pascal.
//http://uva.onlinejudge.org/external/6/656.html
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
const int maxn=10+5; const char * tr[] = {"ADD", "DIV", "DUP", "MUL", "SUB"};
enum op_e { ADD, DIV, DUP, MUL, SUB}; struct State {
State()
{
memset(path, 0, sizeof(path));
pathn=0;
}
stack<int> s;
int path[maxn];
int pathn;
}ans; int x[maxn], y[maxn];
int n; void init()
{
for(int i=0; i<n; i++)
scanf("%d", x+i);
for(int i=0; i<n; i++)
scanf("%d", y+i);
} // return true if trans is valid and modified t
bool trans(State& t, int i)
{
stack<int> &s = t.s;
//A ADD, SUB, MUL or DIV-command is executed when the stack contains only one element.
if(i!=DUP && s.size()==1) return false; int a=s.top();
if(i==DIV && a==0) return false; //当前栈的大小减去剩余步骤的大小,如果大于1,说明永远达不到目标(假设后面不是dup命令,则栈大小都是减一)
int len=s.size()-(10-t.pathn);
if(len>1) return false; //ok, now all options are valid
if(i==DUP)
{
s.push(a);
t.path[t.pathn++]=i;
return true;
} s.pop();//pop a
int b=s.top(); s.pop(); switch(i)
{
case ADD:
s.push(a+b);
break;
case SUB:
s.push(b-a);
break;
case MUL:
s.push(b*a);
break;
case DIV:
s.push(b/a);
break;
}
if(abs(s.top())>30000)
return false; t.path[t.pathn++]=i;
return true;
} bool checkOthers()
{
for (int i = 1; i < n; i++)
{
State t;
t.s.push(x[i]);
for(int j=0; j<ans.pathn; j++)
{
if(!trans(t, ans.path[j]))
return false;
}
if(t.s.top()!=y[i])
return false;
}
return true;
} bool bfs()
{
queue<State> q; ans = State();
State state;
state.s.push(x[0]);
q.push(state); while(!q.empty())
{
State front = q.front(); q.pop(); if(front.s.size()==1 && front.s.top()==y[0])
{
ans = front;
if(checkOthers())
return true;
} //已经10个了,不能再添加了
if(front.pathn==10)
continue; for(int i=ADD;i<=SUB;i++)
{
State t=front;
if(trans(t, i))
q.push(t);
}
}
return false;
} void solve() {
if (bfs()) {
if (ans.pathn == 0) printf("Empty sequence\n");
else {
for (int i = 0; i < ans.pathn - 1; i ++)
printf("%s ", tr[ans.path[i]]);
printf("%s\n", tr[ans.path[ans.pathn - 1]]);
}
}
else printf("Impossible\n");
printf("\n");
} int main()
{
#ifndef ONLINE_JUDGE
freopen("./uva656.in", "r", stdin);
#endif
int kase=0;
while(scanf("%d", &n)!=EOF && n)
{
init();
printf("Program %d\n", ++kase);
solve();
}
return 0;
}
uva656 Optimal Programs的更多相关文章
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
- 泡泡一分钟:Optimal Trajectory Generation for Quadrotor Teach-And-Repeat
张宁 Optimal Trajectory Generation for Quadrotor Teach-And-Repeat链接:https://pan.baidu.com/s/1x0CmuOXiL ...
- 最优运输(Optimal Transfort):从理论到填补的应用
目录 引言 1 背景 2 什么是最优运输? 3 基本概念 3.1 离散测度 (Discrete measures) 3.2 蒙日(Monge)问题 3.3 Kantorovich Relaxation ...
- Optimal Flexible Architecture(最优灵活架构)
来自:Oracle® Database Installation Guide 12_c_ Release 1 (12.1) for Linux Oracle base目录命名规范: /pm/s/u 例 ...
- Leetcode: Optimal Account Balancing
A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...
- some simple recursive lisp programs
1. Write a procedure count-list to count the number of elements in a list (defun count-list (numbers ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- PLoP(Pattern Languages of Programs,程序设计的模式语言)
2014/8/1 12:24:21潘加宇 http://www.umlchina.com/News/Content/340.htmPloP大会2014即将举行 PLoP(Pattern Languag ...
随机推荐
- json对象与json字符串互转方法
jQuery插件支持的转换方式: 复制代码 代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 ...
- C# 改变无边框窗体尺寸大小的方法
; ; ; ; ; ; const int HTBOTTOMLEFT = 0x10; ; protected override void WndProc(ref Message m) { switch ...
- 集合运算 蓝桥杯 set容器
题目描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. 第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素. 第三行 ...
- 2、visual studio 常用设置
1.关闭 “引用” 提示 有时候感觉 “方法” 或者 “类” 上的引用有点乱: 去掉它的步骤: 1)在 “引用”文字上单击鼠标右键: 2)在弹出的“选项” 对话框中,取消 CodeLens: 2.打开 ...
- 使用JSTL的sql:query标签制作分页查询遇到NoSuchFieldError: deferredExpression
参考:http://hi.baidu.com/desyle/item/4fe650265792d7182a0f1c33 症状: 如题所述,代码如下 <sql:query var="re ...
- hdu1142(dj+记忆化搜索)
题意:给你n各点,m行关于这些点的联通关系,以及距离,求从1这个点到2这个点之间,下一个点到2这个点比当前点到2这个点的距离要小的路径的条数...... 思路:dj+记忆化搜索....... #inc ...
- eclipse生成export生成jar详解
使用eclipse打jar包可能还有很多人不是很了解,今天特意测试整理一番. 打jar包有3种形式 JAR file JAR Javadoc ja ...
- getopt--parse command line options
getopt解析命令行选项 getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - Parse command- ...
- 解决centos7 开机/etc/rc.local 不执行的问题
最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 ? 1 2 3 4 5 6 7 8 9 10 11 #!/bi ...
- Linux用ssh登陆出现“Too many authentication failures for root”
vim /etc/ssh/sshd_config 最后参数 UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPR ...