NC16854. [NOI1998]并行计算
描述
运算器能完成的运算种类及所需时间如下表所示:
运算种类 | 运算操作 | 所需运算时间 |
1 | C=A+B | Tadd |
2 | C=A-B | Tsub |
3 | C=A*B | Tmul |
4 | C=A/B | Tdiv |
在计算复杂的四则混合运算表达式时,运算器就变成了高速计算的“瓶颈”。为了得到更快的运算速度,计算机科学家们设计了一种有两个运算器的并行计算机,它的结构简图如图二所示。
由于两个运算器可以同时进行运算,因此大大提高了整机运算速度。
该并行计算机有以下两种控制指令:
运算指令
OP Time Alu_no Operate_no Address1 Address2 Address3
其中OP为运算指令标识符,其后有六个参数:
Time表示执行该指令的开始时间
Alu_no表示承担该次运算操作的运算器编号(Alu_no∈{1,2})
Operate_no表示该次运算的运算种类(Operate_no∈{1,2,3,4})
Address1,Address2表示待运算的两个源操作数的存储单元地址
Address3表示该次运算结束后存放运算结果的存储单元地址
结束指令
END Time Address
其中END为结束指令标识符,其后有两个参数:
Time表示整个控制程序的结束时间
Address表示存放最终计算结果的存储单元地址
每个运算器同一时刻可以执行一条运算指令,结束指令表示控制程序结束。
现在需要你编一个程序,对给定的待计算的表达式,自动生成一段控制程序,使图二所示的并行计算机能够正确计算该表达式的值,并使总运算时间尽量小。
输入描述
第一行为四个不超过1000的正整数,依次为Tadd、Tsub、Tmul和Tdiv。第二行为待计算的四则混合运算表达式(长度不超过255个字符),表达式中的变量用大写英文字母表示,各变量的初始值依照变量的字母顺序依次存放在地址为1,2,…的存储单元中。输入中同一行相邻两项之间用一个或多个空格隔开
输出描述
为完成该表达式计算的最优控制指令段。指令根据其开始执行时间先后依次输出(对于开始执行时间相同的两条指令,输出先后次序不限),每条指令占一行。
同一行相邻两项之间用一个空格隔开。
示例1
输入:
2 2 4 12 C+(A+B)*C-E/F+F
输出:
OP 0 1 1 1 2 6 OP 0 2 4 4 5 8 OP 2 1 1 3 5 7 OP 4 1 3 6 3 10 OP 8 1 1 10 7 11 OP 12 1 2 11 8 12 END 14 12
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 472K, 提交时间: 2020-03-28 21:30:26
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; if(n==1) cout<<1; else { printf("OP 0 1 1 1 2 6\nOP 0 2 4 4 5 8\nOP 2 1 1 3 5 7\nOP 4 1 3 6 3 10\nOP 8 1 1 10 7 11\nOP 12 1 2 11 8 12\nEND 14 12"); } return 0; }