ALGO-1005 数字游戏(Java)

资源限制

内存限制: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,不知道是哪个输入案例有错 ,请各位大佬指正

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值