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.

posted on 2011-10-31 21:56  codeway3  阅读(372)  评论(0编辑  收藏  举报

导航