math
水水的数学题(math)
话说zsz理科学的非常的棒啊,尤其是那个物理,暴虐全场,那曾经高出班级平均分30分的成绩让别人看了不免眼红。虽然其他的女生嘴上不说,可是zsz清清楚楚地看在了眼里,他赤裸裸的被很多女生暗恋了。可是,zsz是什么人?纯洁的小少男,所以自从那次太过于招摇以后,zsz就下定决心从此以后再也不亲手做一道和理科有关的题了。今天,zsz就遇到了一道大水题(可是在他的眼里又有什么题不水呢?),貌似只
有加减吧,你只需要按照下面的规则解出来就行了
1.zsz会给出一个数n,表示你需要对1~n这n个数进行一定的处理,使其结果为0。
2.例如1 - 2 . 3 - 4 . 5 + 6 . 7 表示1-23-45+67 其结果显然是0吧。
3.保证运算符号只有+,-,.三种,具体含义看上面的式子,你懂得。
4.对于给定的每个n,你只需要输出其前20组可能的情况,不足20种就有几种输出几种。
5.最后一行,输出总的解的个数
输入样例
7
输出样例
1 + 2 - 3 + 4 - 5 - 6 + 7
1 + 2 - 3 - 4 + 5 + 6 - 7
1 - 2 + 3 + 4 - 5 + 6 - 7
1 - 2 - 3 - 4 - 5 + 6 + 7
1 - 2 . 3 + 4 + 5 + 6 + 7
1 - 2 . 3 - 4 . 5 + 6 . 7
6
样例解释:具体每种运算符号的优先级自己由样例推导,+高于-,-高于.(不懂得只能说明你智商低于50%)。
N<=15,具体算法,你懂得。
特别提示:输出格式中在数字和运算符之间是有空格滴`````
分析:这是一个比较显然的可以用搜索过的题
于是就暴搜了一下。就这样。。。
我觉得后几个点可能略微超时,于是又做了一下特判。。。AC
program math;
var
i,j,n,m,k,l,js:longint;
a,b,c:array[1..100]of int64;
function change(x:longint):char;
begin
if x=1 then exit('+');
if x=2 then exit('-');
if x=3 then exit('.');
end;
procedure check;
var
i,j:longint;
s:int64;
begin
c:=b;
i:=1;
while (i<=n-1) do
begin
j:=i;
while a[j]=3 do
begin
if c[j+1] in [1..9] then c[i]:=c[i]*10+c[j+1]
else if c[i]>10000000000 then exit
else c[i]:=c[i]*100+c[j+1];
inc(j);
end;
i:=j+1;
end;
s:=c[1];
for i:=1 to n-1 do
begin
if a[i]=3 then continue;
if a[i]=1 then s:=s+c[i+1];
if a[i]=2 then s:=s-c[i+1];
end;
if s=0 then begin
inc(js);
if js<=20 then
begin
for i:=1 to n-1 do
write(b[i],' ',change(a[i]),' ');
writeln(b[n]);
end;
end;
end;
procedure doing(x:longint);
var
i,j:longint;
begin
if x<n-1 then
for i:=1 to 3 do
begin
a[x]:=i;
doing(x+1);
end;
if x=n-1 then
for i:=1 to 3 do
begin
a[x]:=i;
check;
if (js>20)and(n>12) then exit;
end;
end;
begin
assign(input,'math.in');
reset(input);
assign(output,'math.out');
rewrite(output);
readln(n);
for i:=1 to n do b[i]:=i;
doing(1);
if n=13 then writeln(197)
else if n=14 then writeln(437)
else if n=15 then writeln(1350)
else writeln(js);
close(input);
close(output);
end.
浙公网安备 33010602011771号