资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
例如:
3 1 2 4
4 3 6
7 9
16
现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
第1行为两个正整数n,sum
输出格式
一个1~N的一个排列
样例输入
4 16
样例输出
3 1 2 4
数据规模和约定
0<n<=10
这道题想了很久,因为一直理解不了字典序最小是什么意思,写了两个程序,就拿例题来说,第一个程序输出了 1 1 1 9,第二个程序输出了2 2 2 2。
最后也没有解决。
附上第二个代码(第一个手残删了)
#include<stdio.h>
int fullarm(int n,int b) //杨辉三角的控制
{
int a[10]={1};
if(b!=0&&b!=(n-1)&&n!=2)
a[b]=fullarm(n-1,b-1)+fullarm(n-1,b);
else
a[b]=1;
return a[b];
}
int aidaid(int n,int b,int *a) //控制应该自增的数组位置
{
a[b]++;
b++;
if(b==n)
b=0;
return b;
}
int main(void)
{
int n;
scanf("%d",&n);
int sum;
scanf("%d",&sum);
int a[10]={1,1,1,1,1,1,1,1,1,1};
int b;
int c=0;
int d=1;
int t=0;
while(d)
{
for(c=0,b=0;b<n;b++)
{
c=c+a[b]*fullarm(n,b);
}
b--;
if(sum!=c)
{
t=aidaid(n,t,a);
}
else
d=0;
}
for(b=0;b<n;b++)
{
printf("%d ",a[b]);
}
return 0;
}