USACO 2.3.3 Zero Sum

来源:互联网 发布:广数g76车螺纹编程实例 编辑:程序博客网 时间:2024/05/16 12:55

思路:首先要构造表达式,以9为例来说,1   2   3   4   5   6   7   8   9中间共有八个需要填的运算符号,而每个空有三个选择,‘+','-',’ ‘,共有3^8种可能,可以依次遍历这6561种可能,然后再把运算符号插入到九个数字中间,这样就形成了一个个表达式。然后在解析这个表达式就可以了。怎么解析表达式呢?一种方法是,把每个数字和其前面的符号放到一块存储在一个数组中。然后再遍历数组累加其中的数字就好了。

源代码:

/*ID: supersnow0622PROG: zerosumLANG: C++*/#include <iostream>#include <fstream>#include <string>#include<algorithm>#include<memory.h>using namespace std;int N,Count=0;int arr[10];char ch[4]={'+','-',' ','\0'};string str,s[20];void convert(int n){  memset(arr,0,sizeof(arr));  int temp=0;  while(n!=0)  {    arr[temp++]=n%3;    n/=3;  }}int shuzi(string str){    int res[1000];    char  pre=str[0];    int t=0,r=1,n=0;    for(int i=0;i<(int)str.length();i++)    {        if('0'<=str[i]&&str[i]<='9')        {            t=t*r+(str[i]-'0');            r*=10;        }        if(str[i]=='+')        {            if(pre=='-')                res[n++]=-t;            else res[n++]=t;            r=1;t=0;pre='+';        }        if(str[i]=='-')        {            if(pre=='-')                res[n++]=-t;            else res[n++]=t;            r=1;t=0;pre='-';        }    }    if(pre=='-')        res[n++]=-t;    else res[n++]=t;    t=0;    for(int i=0;i<n;i++)        t+=res[i];    if(t==0)    s[Count++]=str;    return t;}int main(){    ofstream fout ("zerosum.out");    ifstream fin ("zerosum.in");    cin>>N;    int sum=1;    string str;    for(int i=0;i<N-1;i++)     sum*=3;    for(int a=0;a<sum;a++)    {       convert(a);       str="1";       for(int i=0;i<N-1;i++)        {         str+=ch[arr[i]];         str+=i+2+'0';        }        shuzi(str);    }    sort(s,s+Count);    for(int i=0;i<Count;i++)     cout<<s[i]<<endl;    return 0;}


原创粉丝点击