蓝桥杯第六届省赛java组大题解析(“生命之树”三星难度,垒骰子四星难度)

第六题

题目:

 


加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

 

 

注意:需要你提交的是一个整数,不要填写任何多余的内容。

 

答案:

16

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		for(int i=1;i<=46;i++){
			for(int j=i+2;j<=48;j++){
				p(i,j);
			}
		}
	}
	public static void p(int i,int j){
		if((1225-2*i-2*j-2+i*(i+1)+j*(j+1))==2015)
			System.out.println(i+" "+j);
	}
}

分析:这道题很简单,无非从1开始一直到最后一位数遍历,看看乘号放在哪里能使等式成立。

总结:对于穷举型算法题,需要找到题目的各种可能的情况,然后编写代码

 

第七题

题目:

牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。

 

答案:

3598180

import java.util.ArrayList;

public class Main {
	static int answ=0;
	public static void main(String[] args)throws Exception{
		ArrayList<Integer> al=new ArrayList<Integer>();
		for(int i=1;i<=13;i++) {
			al.add(i);
			p(al);
			al.remove(0);
		}		
		System.out.println(answ);
	}
	public static void p(ArrayList<Integer> al) {
		if(al.size()==13) {
			//如果牌数达到13张,总数加一,当前递归结束
			answ++;
			return;
		}
		if(al.size()<4||al.get(al.size()-4)!=al.get(al.size()-1)) {
			//如果最后四张不是相同牌,就可以继续加这张牌入卡组
			al.add(al.get(al.size()-1));
			p(al);
			al.remove(al.size()-1);
		}
		for(int i=al.get(al.size()-1)+1;i<=13;i++) {
			//加比最后一张大i的牌入卡组
			al.add(i);
			p(al);
			al.remove(al.size()-1);
		}
	}
}

本来不准备写这道题的解析的,但是因为这道题是填空题,所以搜索网上的答案发现基本上都是无技巧穷举,于是想写出一个时间复杂度很低的算法解此题。
 

分析:13张穷举自然可行,但是如果想降低时间复杂度,需要考虑如何使每一次递归得出的最终结果都是可行的(符合牌型条件)而不做淘汰处理,则可使时间复杂度最低。

那么就在普通递归的前提下,加上一个从小到大依次加入卡牌的条件,然后如果最后四张相同,就不能继续加此卡牌,此时时间复杂度则最低。
 

总结:越是条件少的题目,越需要自己根据编写的代码创造新的判断条件,这样才能使时间复杂度进一步降低。

 

第八题

题目:

饮料换购
乐羊羊饮料厂正在举办一次促销优

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值