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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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   codeway3  阅读(373)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

< 2011年10月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示