1653: [Usaco2006 Feb]Backward Digit Sums
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 318 Solved: 239
[Submit][Status][Discuss]
Description
Input
Output
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
我能想到的是枚举。。然后不确定就去搜题解。。结果发现真的是枚举,而且考虑到枚举的话处理累加有点麻烦,就看了网上的题解就懂了。前后各加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("\n");
return 0;
}
}while(next_permutation(a+1,a+n+1));
return 0;
}
---------------------------------------------------------------------------------