3360: [Usaco2004 Jan]算二十四
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 6 Solved: 6
[Submit][Status][Discuss]
Description
写一个程序,给出D(2≤D≤10)个数字,按原顺序在数字间加+,一,×算出24,且不使用括
号.优先级按正常的优先级处理,即先做乘法后做加减法.输出有多少种不同的方案数.
Input
第1行:一个整数D.
第2到D+1行:D个整数,在1到50之间.
Output
输出方案总数.
Sample Input
5
6
4
2
8
16
6
4
2
8
16
Sample Output
4
样例说明
四种方法分别是6x4x2-8-16,6-4- 2+8+16,6x4-2 x8+16,6×4+2×8-16.
样例说明
四种方法分别是6x4x2-8-16,6-4- 2+8+16,6x4-2 x8+16,6×4+2×8-16.
HINT
Source
题解:直接O(3N)都能过。。。水水哒。。。
(还有话说USACO Orange/Green/Blue 这玩意是什么鬼= =,别告诉我Orange=Bronze阿阿阿QAQ,@bx2k @Recursionsheep @acphile @wnjxyk)
const d:array[..] of char=('+','-','*');
var
i,j,k,l,m,n:longint;
a,b:array[..] of longint;
function calc:int64;
var i:longint;a1,a2,a3:int64;
begin
a1:=;a2:=a[];a3:=;
for i:= to n do
begin
case b[i-] of
:BEGIN
if a3= then a1:=a1+a2 else a1:=a1-a2;
a2:=a[i];a3:=;
end;
:begin
if a3= then a1:=a1+a2 else a1:=a1-a2;
a2:=a[i];a3:=;
end;
:begin
a2:=a2*a[i];
end;
end;
end;
if a3= then a1:=a1+a2 else a1:=a1-a2;
calc:=a1;
end;
procedure dfs(x:longint);inline;
var i:longint;
begin
if x>=n then
begin
if calc= then inc(l);
exit;
end;
for i:= to do
begin
b[x]:=i;
dfs(x+);
end;
end;
begin
readln(n);
for i:= to n do readln(a[i]);
l:=;
dfs();
writeln(l);
end.