竞赛积分猜想

某公司举办了知识竞赛。题目的计分规则如下:
1.每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前得到的分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
2.每位选手都有一个起步的分数为10分。 



 

程序要求:

如果某获胜选手最终得分是X分,如果不让你看比赛过程,请推断出他(她)哪个题目答对了,哪个题目答错了吗?把答对的题目记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是一种可能的情况,10道题目的编号从左到右依次排列。


你的任务是算出满足该得分的所有可能情况,答案之间用|号分隔,并且答案需要进行排序,将答案转换为十进制后数字小的排在前面,即0010110011应该排在1010110011的前面。如果不存在满足该分数的情况,则输出10个0:0000000000
 
运行时间限制: 无限制 
内存限制: 无限制 
输入: 选手的得分,正整数。
 
输出: 满足输入得分的所有可能的情况,答案之间用|号分隔,并且答案需要进行排序,将答案转换为十进制后数字小的排在前面,即0010110011应该排在1010110011的前面。如果不存在满足该分数的情况,则输出10个0:0000000000
 
样例输入: 100 
样例输出: 0010110011|0111010000|1011010000 


import java.util.ArrayList;
import java.util.List;

public class Text {
	static boolean flag = false;
	static List<ArrayList<Integer>> list = new ArrayList<>();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] x = new int[10];
		// 测试
		cal(x, 0, 100);

		if (flag == false) {
			for (int i = 0; i < 9; i++) {

				System.out.print("0:0000000000|");
			}
			System.out.print("0:0000000000");
		} else {
			for (int j = 0; j < list.size() - 1; j++) {
				for (int temp : list.get(j)) {
					System.out.print(temp);
				}
				System.out.print("|");
			}
			for (int temp : list.get(list.size() - 1)) {
				System.out.print(temp);
			}
		}

	}

	/**
	 * 
	 * @param arr
	 *            数组
	 * @param scorecount
	 *            分数
	 */
	public static boolean cal1(int[] arr, int scorecount) {

		int score = 10;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == 0) {
				score = score - i - 1;
			} else {
				score = 2 * score;
			}
		}
		if (score == scorecount) {
			return true;
		} else {
			return false;
		}

	}

	/**
	 * 递归调用
	 * 
	 * @param arr
	 *            保存结果数组
	 * @param n
	 *            下标
	 * @param score
	 *            分数
	 */
	public static void cal(int[] arr, int n, int score) {
		if (n >= arr.length) {
			if (cal1(arr, score)) {
				ArrayList<Integer> temp = new ArrayList<>();
				for (int j : arr) {
					temp.add(j);

				}
				list.add(temp);
				flag = true;

			} 
			return;
		}
		//对当前下标赋值,可为0或1 
		arr[n] = 0;
		//每次赋值进行判断当前结果是否符合
		cal(arr, n + 1, score);
		arr[n] = 1;
		cal(arr, n + 1, score);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值