zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    每天一个linux命令(5):rm 命令
    每天一个linux命令(3):pwd命令
    c++11之lambda表达式
    C++11之std::future和std::promise和std::std::packaged_task
    金三银四,为什么面试你总拿不到高薪?
    高并发神器 Nginx,到底该怎么学?
    好文 | MySQL 索引B+树原理,以及建索引的几大原则
    为什么 TCP 建立连接是三次握手,关闭连接确是四次挥手呢?
    Java & 架构硬核福利,速度上车!
    Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!
  • 原文地址:https://www.cnblogs.com/icedream61/p/4524678.html
Copyright © 2011-2022 走看看