POJ-3187
Backward Digit Sums
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7634 Accepted: 4398 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 4Behind 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.
4 3 6
7 9
16
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 16Sample Output
3 1 2 4note
Explanation of the sample:
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
题意:
对于倒杨辉三角,给出第一行的元素个数和最后一行的结果,求字典序最小的第一行组合。
用next_permutation()遍历所有排列直到求出结果==x,break。
AC代码:
1 //#include<bits/stdc++.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 const int INF=1<<30; 10 char str[30]; 11 int num[15]; 12 13 int main(){ 14 int n; 15 cin>>n; 16 getchar(); 17 while(n--){ 18 int res=INF; 19 gets(str);//得到数列 20 int len=strlen(str); 21 int k=0; 22 for(int i=0;i<len;i++){ 23 if(str[i]>='0'&&str[i]<='9'){ 24 num[k++]=str[i]-'0'; 25 } 26 } 27 if(k==2){//如果只有两个数的情况 28 cout<<abs(num[0]-num[1])<<endl; 29 continue; 30 } 31 while(num[0]==0){//不能含有前导零 32 next_permutation(num,num+k); 33 } 34 //int ans=INF; 35 do{ 36 int mid=(k+1)/2; 37 if(num[mid]){//第二个数也不能有前导零 38 int a=0,b=0; 39 for(int i=0;i<mid;i++){ 40 a=a*10+num[i]; 41 } 42 for(int i=mid;i<k;i++){ 43 b=b*10+num[i]; 44 } 45 res=min(res,abs(a-b)); 46 } 47 48 }while(next_permutation(num,num+k)); 49 cout<<res<<endl; 50 } 51 return 0; 52 }