• USACO 2.33 Zero Sum


    题意:

    考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。

    分析:DFS枚举就好了

    关键就是 处理‘ ’,用last保存最近的一个连续的整数,不将该数进行运算,sum表示last之前的运算结果

    若当前选择了 ' ':sum=sum-last+last*10+s+1(last>0);sum=sum-last+last*10-s-1(last<0); 
                      last=last*10+s+1(last>0);last=last*10-s-1(last<0)
    若当前选择了 '+':sum=sum+s+1;last=s+1
    若当前选择了 '-':sum=sum-s-1;last=-s-1
    /*
    ID: nanke691
    LANG: C++
    TASK: zerosum
    */
    #include<iostream>
    #include<algorithm>
    #include<fstream>
    using namespace std;
    char str[18];
    int n;
    void DFS(int k, int sum, int last)
    {
    	if (k == n)
    	{
    		if (sum+last == 0) cout<<str<<endl;
    		return;
    	}
    	str[k*2-1] = ' ';
    	DFS(k+1, sum, last > 0 ? last*10+k+1 : last*10-k-1);
    	str[k*2-1] = '+';
    	DFS(k+1, sum+last, k+1);
    	str[k*2-1] = '-';
    	DFS(k+1, sum+last, -k-1);
    }
     
    int main()
    {
    	freopen("zerosum.in", "r", stdin);
    	freopen("zerosum.out", "w", stdout);
    	cin>>n;
    	for (int i = 0; i < n; ++i)
    		str[i*2] = i+'1';
    	DFS(1, 0, 1);
    }
    
  • 相关阅读:
    多任务拷贝小案例
    进程池
    进程间的通信
    互斥锁
    创建函数/类的线程
    udp/tcp流程
    发布模块
    私有属性/方法的访问
    深入了解jQuery之整体架构
    (转)前端面试题
  • 原文地址:https://www.cnblogs.com/nanke/p/2247345.html
Copyright © 2020-2023  润新知