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.