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;
    }

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

  • 相关阅读:
    工作态度
    SQL7.0有如下问题:视图字段未及时刷新
    遇到不讲交期的客户
    关于CashFiesta.com
    设置主机多IP技术失败
    已好的客户要建立VSS了
    MSSQL说日志已满
    特殊的四舍五入
    如何保证对帐不遗漏?
    Linux常用命令之其它类型命令汇总
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4820232.html
Copyright © 2011-2022 走看看