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

来源:互联网 发布:linux查看目录权限 编辑:程序博客网 时间:2024/05/21 08:52


打靶


小明参加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       96static 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

原创粉丝点击