资源限制
内存限制: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~N的排列按照字典序一个个列出来,判断是否满足要求,若满足则输出并停止遍历。
实现代码:
import java.util.*;
//数字游戏
public class Main{
public static int[] a = new int[11];
public static int sum = 0;
public static int temp = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
sum = scanner.nextInt();
int[] A = new int[n+1];
permutation(n, A, 0);
for(int i=0; i<n;i++) {
System.out.print(a[i]+" ");
}
}
//枚举排列
static void permutation(int n, int A[],int cur) {
//判断当前是否已经有排列满足要求
if(temp == 1) {
return;
}
if(cur == n) {
//int num = 0;
int[] arr = new int[n];
for(int i=0;i<n;i++) {
arr[i] = A[i];
}
//num = A[0] + A[n-1];
for(int i = n-1; i>0; i--) {
for(int j = 0;j<i;j++) {
arr[j] = arr[j] + arr[j+1];
}
}
//System.out.println(arr[0]);
//判断是否满足条件,若满足则将其放在数组a中,并退出
if(arr[0] == sum) {
//当前已经有排列满足要求
temp = 1;
for(int i = 0; i<n; i++) {
a[i]=A[i];
}
return;
}
}
else
for(int i = 1; i<=n; i++) {
int ok = 1;
for(int j = 0; j<cur; j++) {
if(A[j] == i)
ok = 0;
}
if(ok == 1) {
A[cur] = i;
permutation(n, A, cur+1);
}
}
}
}
自己测试了几遍都正确,但是得分只有90,不知道是哪个输入案例有错 ,请各位大佬指正