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

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

  • 相关阅读:
    RabbitMQ官方教程四 Routing(GOLANG语言实现)
    RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现)
    RabbitMQ官方教程二 Work Queues(GOLANG语言实现)
    RabbitMQ官方教程一Hello World(GOLANG语言实现)
    etcd学习之安装与命令
    docker安装consul集群
    golang实现无限级菜单(beego框架下)
    beego框架(golang)学习过滤器(实现restful请求)
    beego框架(golang)学习验证码
    九 Android基本知识介绍
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4820232.html
Copyright © 2011-2022 走看看