Link: HuangJing
Train of Thought: It's easy to think of DFS, but it's so hard to calculate those values like Yang Hui's triangle. I think my teammates are really amazing, recursively calculate the value at the top of the Yang Hui triangle .... For detailed implementation, see the code...
Question:
Language:DefaultBackward digit sums
Time limit:1000 ms |
|
Memory limit:65536 K |
Total submissions:4285 |
|
Accepted:2474 |
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 Hint Explanation of the sample:
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.Source Usaco 2006 February Gold & Silver |
Code:
#include<cstdio>#include<cstring>const int maxn=10+10;int a[maxn],ans[maxn],n,target,flag;bool vis[maxn];int forever(int n){ if(n==0) return a[0]; for(int i=0;i<n-1;i++) a[i]=a[i]+a[i+1]; return forever(n-1);}void dfs(int pos){ if(flag) return; if(pos==n) { for(int i=0;i<=n-1;i++) a[i]=ans[i]; if(forever(n)==target) { flag=1; for(int i=0;i<n-1;i++) printf("%d ",ans[i]); printf("%d\n",a[n-1]); } } for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=true; ans[pos]=i; dfs(pos+1); vis[i]=false; } }}int main(){ while(~scanf("%d%d",&n,&target)) { flag=0; memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) { ans[0]=i; vis[i]=true; dfs(1); vis[i]=false; } } return 0;}