• 【USACO 2.3.3】零数列


    【题目描述】

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

    【格式】

    PROGRAM NAME: zerosum

    INPUT FORMAT

    单独的一行表示整数N (3 <= N <= 9)。

    OUTPUT FORMAT

    按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到结果为零的数列。

    【分析】

    直接DFS,注意累加的时候的公式:

    sum-last+last*10+(last的符号)*k(当前数字).

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <cstring>
     7 using namespace std;
     8 int n;
     9 int sgn(int k) {return k>0?1:-1;}//判断符号 
    10 void dfs(int sum,int last,int k,string rem) 
    11 {
    12     if(k==n+1)//边界条件 
    13     {
    14         if(sum==0) cout<<rem<<endl;
    15         return;
    16     }
    17     //sum+(last*9+sgn(last)*k)这句意思是 
    18     dfs(sum+(last*9+sgn(last)*k),last*10+sgn(last)*k,k+1,rem+" "+(char)(k+48));
    19     dfs(sum+k,k,k+1,rem+"+"+(char)(k+48));
    20     dfs(sum-k,-k,k+1,rem+"-"+(char)(k+48));
    21 }
    22 int main()
    23 {
    24     //文件操作
    25     freopen("zerosum.in","r",stdin);
    26     freopen("zerosum.out","w",stdout);
    27     scanf("%d",&n);
    28     dfs(1,1,2,"1");
    29     return 0;
    30 }
  • 相关阅读:
    MT7601 AP模式移植
    dhcp server 移植记录
    MT7601 WG209模块驱动移植,并连接路由器
    git 忽略文件
    关于中文--Unicode之间互相转换流程的说明
    将文字拆成拼音得到首字母(返回多音字)
    Javascript 汉字转首字母的拼音 js文件(支持多音字的选择)
    如何使用netstat –ano|findstr “port”命令?
    notepad++如何修改主题
    Notepad++ 更换主题
  • 原文地址:https://www.cnblogs.com/hoskey/p/3800162.html
Copyright © 2020-2023  润新知