zoukankan      html  css  js  c++  java
  • bzoj1653:Backward Digit Sums

    1653: [Usaco2006 Feb]Backward Digit Sums

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 318  Solved: 239
    [Submit][Status][Discuss]

    Description

    FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this: 3 1 2 4 4 3 6 7 9 16 Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities. Write a program to help FJ play the game and keep up with the cows.

    Input

    * Line 1: Two space-separated integers: N and the final sum.

    Output

    * Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.

    Sample Input


    4 16

    Sample Output


    3 1 2 4

    OUTPUT DETAILS:

    There are other possible sequences, such as 3 2 1 4, but 3 1 2 4
    is the lexicographically smallest.

    HINT

     

    Source

    Silver

    我能想到的是枚举。。然后不确定就去搜题解。。结果发现真的是枚举,而且考虑到枚举的话处理累加有点麻烦,就看了网上的题解就懂了。前后各加1次中间的都加n-1次;

    优化的部分原理如下

    f[1]=3+2;

    f[2]=2+1;f[1]=3+2+2+1

    f[3]=1+4;f[2]=2+1+1+4;f[1]=3+2+2+1+2+1+1+4;

    就是这样梓的原理,每一次都能够将涉及的节点的累加值求出来,方法要记住

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

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a[11];
    int f[11];
    int main(){
     int n,m;
     scanf("%d%d",&n,&m);
     for(int i=1;i<=n;i++)
       a[i]=i;
     do{
      for(int i=1;i<=n;i++)
        f[i]=a[i];
      for(int i=1;i<n;i++)
        for(int j=i;j>=1;j--)
          f[j]+=f[j+1];
      if(f[1]==m){
       printf("%d",a[1]);
       for(int i=2;i<=n;i++)
         printf(" %d",a[i]);
       printf(" ");
       return 0;
      }
     }while(next_permutation(a+1,a+n+1));
     return 0;
    }

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

  • 相关阅读:
    手机站测试工具(node服务器)
    [mongodb]child process failed, exited with error number 100
    正则
    VBA基础之Excel 工作薄(Book)的操作(三)
    VBA基础之Excel 工作表(Sheet)的操作(二)
    VBA基础之Excel VBA 表格的操作(一)
    基本的布局问题
    【转】jQuery最佳实践
    【转】jQuery的deferred对象详解
    2018-2019-1 20189221《Linux内核原理与分析》第二周作业
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4820232.html
Copyright © 2011-2022 走看看