• USACO Section2.3 Zero Sum 解题报告 【icedream61】


        zerosum解题报告
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【题目】
      给你N。
      把1到N依次写出,每相邻两个数字中间加上一个字符,三选一:'+','-',' '。
      如此,便可形成很多表达式,把其中计算结果为0的按字典序输出。
    【数据范围】
      3<=N<=9
    【输入样例】
      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
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【分析】
      枚举。脑子清楚,代码别写错就好。
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【总结】
      一遍AC。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    【代码】

     1 /*
     2 ID: icedrea1
     3 PROB: zerosum
     4 LANG: C++
     5 */
     6 
     7 #include <iostream>
     8 #include <fstream>
     9 using namespace std;
    10 
    11 int N;
    12 char mark[9];
    13 
    14 int get(int &l)
    15 {
    16     int r=l;
    17     while(r<N && mark[r]==' ') ++r;
    18     int x=0;
    19     for(int i=l;i<=r;++i) x=x*10+i;
    20     l=r+1;
    21     return x;
    22 }
    23 
    24 void get(int i,char &c)
    25 {
    26     c=mark[i-1];
    27 }
    28 
    29 void print(ostream& out)
    30 {
    31     for(int i=1;i<=N-1;++i) out<<i<<mark[i];
    32     out<<N<<endl;
    33 }
    34 
    35 void test(ostream& out)
    36 {
    37     //cout<<"test: "; print(cout);
    38     int r=0;
    39     char c='+';
    40     for(int i=1,num=get(i);;num=get(i))
    41     {
    42         if(c=='+') r+=num; else r-=num;
    43         if(i==N+1) break; else get(i,c);
    44     }
    45     if(r==0) print(out);
    46 }
    47 
    48 void go(int i,ostream& out)
    49 {
    50     //cout<<i<<endl;
    51     if(i==N) { test(out); return; }
    52     mark[i]=' '; go(i+1,out);
    53     mark[i]='+'; go(i+1,out);
    54     mark[i]='-'; go(i+1,out);
    55 }
    56 
    57 int main()
    58 {
    59     //printf("%d %d %d
    ",'+','-',' ');
    60 
    61     ifstream in("zerosum.in");
    62     ofstream out("zerosum.out");
    63 
    64     in>>N;
    65 
    66     go(1,out);
    67 
    68     in.close();
    69     out.close();
    70     return 0;
    71 }
  • 相关阅读:
    C#SortedList排序列表怎么样逆序输出
    使 SortList 实现重复键排序
    【转】delphi程序只允许运行一个实例的三种方法:
    Delphi中控制Excel(转载)
    spring和hibernate的集成
    使用Jedis操作redis
    使用java发送邮件
    error at ::0 can't find referenced pointcut...解决方法
    log4j简单的使用
    spring学习笔记三:Component注解(把POJO类实例化到spring的IOC容器中)
  • 原文地址:https://www.cnblogs.com/icedream61/p/4524678.html
Copyright © 2020-2023  润新知