2016 蓝桥杯国赛 JAVA B组第三题 打靶


打靶


小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。


这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。


不同环数得分是这样设置的:
1,2,3,5,10,20,25,50


那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?


下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。


public class Main
{
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
{
if(ho<0 || bu<0 || sc<0) return;
if(k==ta.length){
if(ho>0 || bu>0 || sc>0) return;
for(int i=0; i<da.length; i++){
for(int j=0; j<da[i]; j++) 
System.out.print(ta[i] + " ");
}
System.out.println();
return;
}

for(int i=0; i<=bu; i++){
da[k] = i;
f(ta, da, k+1,  __________________ , bu-i, sc-ta[k]*i);   // 填空位置
}

da[k] = 0;
}

public static void main(String[] args)
{
int[] ta = {1,2,3,5,10,20,25,50};
int[] da = new int[8];
f(ta, da, 0, 3, 6, 96);
}
}






注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。






f()的参数列表有点长,然而第一个数组显而易见,最后四个参数分别为0, 3, 6, 96。那么不出意外96应该为最后的分数,6为打了6发子弹,根据递归的方法,k应该为递归的层数,那么,就只剩ho和da[],根据题目描述,实在找不出多少个数字3(3个弹孔。六发子弹留了3个孔,6-3)。所以我暂时猜测ho为已有的弹孔数量,发现结果不对,再猜测ho为重复命中已有弹孔的次数,而da[]的长度为8,等于ta[]记录分数数组的长度,且方法中的两个循环输出只输出6个值,所以da[]中应该有的值为0;在这里也暂时猜测da记录ta中各个分数命中的次数。


那么就有填空的答案:

i<=1?ho:ho+1-i


运行下,输出

3 3 20 20 25 25 

2 2 2 20 20 50 

1 10 10 25 25 25 


结果正确!


答案:

package 总决赛;

public class 打靶 {
	//            设置的环数                0      3       6       96
	static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
	//                                       3个弹孔  6发子弹
	{
		if(ho<0 || bu<0 || sc<0) return;
		if(k==ta.length){//递归的层数
			if(ho>0 || bu>0 || sc>0) return;
			for(int i=0; i
  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值