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

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

原文地址:https://www.cnblogs.com/20003238wzc--/p/4820232.html