兔宝宝刷题:2018蓝桥杯JavaB省赛

一、第几天(5/5分)

2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?

解题思路:

每月天数相加即可

代码如下:

public class a01_day {
	public static void main(String[] args) {
		System.out.println(1+ 31 + 29 + 31 + 30 + (4 - 1));
	}
}

二、方格计数(7/7分)

答案:3137548

解题思路:

1.在几何中解决问题:

如上图,在圆的第二象限中分析可得:l的长度为根号下2X^2,且l的长度必须小于等于r。

循环找到符合条件的最大的x,然后计算得到答案为:4999904100(错误),在这个思路上纠结了很久还是想不明白哪里出了问题,如果有大神看到的可以评论告诉我,谢谢!!

终于发现问题了,一个象限内的小方格拼成的可能是个不规则的形状,不一定是一个大正方体,我真是个笨蛋。

代码:(非正确答案)

public class a02_FangGeSum {
	public static void main(String[] args) {
		long r = 50000l * 50000l;
		long x = 0;//记录大方格的边长的一半
		while(true) {//得到方格的一半边长
			long l = x * x * 2;
			if(l < r) {
				 x++;
			}
			else if(l == r) {
				break;
			}
			else {
				x--;
				break;
			}
		}
		System.out.println(x * x * 4);
	}
}

2.两层循环分别表示横坐标为x和纵坐标为y的小方格,在圆内则计数器cnt++

代码如下:(正确答案)

public class a02_FangGeSum {
	public static void main(String[] args) {
		long r = 1000;
		long cnt = 0;
		for (long i = 1; i <= r; i++) {
			for (long j = 1; j <= r; j++) {
				if(i == 0 || j == 0) {
					continue;
				}
				if((i * i + j * j <= r * r)) {
					cnt++;
				}
			}
		}
		System.out.println(4 * cnt);
	}
}

三、复数幂(0/13分)

这题出现在前面但是蓝桥云课官网上正确率只有30%,太坑啦。

解题思路:

可以发现序号1和序号2的两个因子相乘都是对实部进行计算,序号3和序号4的两个因子相乘都是对虚部进行计算,那么需要分开计算他们。因为数据量很大所以需要用BigInteger进行计算。

代码如下:

import java.math.BigInteger;

public class a03_FuShuMi {
	public static void main(String[] args) {
		StringBuilder s1 = new StringBuilder("2");//存实部
		StringBuilder s2 = new StringBuilder("3");//存虚部
		for (int i = 1; i < 123456; i++) {
			System.out.println("i = " + i); 
			BigInteger b1 = new BigInteger(s1.toString());//得到实部用于计算  2
			BigInteger b2 = new BigInteger(s2.toString());//得到虚部用于计算  3
			//BigInteger b3 = b2.multiply(new BigInteger("3"));
			BigInteger b3 = b1;//得到实部用于计算  2
			BigInteger b4 = b2;//得到虚部用于计算  3
			b1 = b1.multiply(new BigInteger("2"));//b1 = b1 x 2 = 4
			b1 = b1.subtract(b2.multiply(new BigInteger("3")));//b1 = b1 - b2 x 3 = -5
			s1 = new StringBuilder(b1.toString());//将计算完的实部返还给字符串容器s1
			b4 = b4.multiply(new BigInteger("2"));//b4 = b4 x 2 = 6
			b4 = b4.add(b3.multiply(new BigInteger("3")));//b4 = b4 + b3 x 3
			s2 = new StringBuilder(b4.toString());//将计算完的虚部返还给字符串容器s2
			
		}
		if(s2.toString().charAt(0) == '-') {
			System.out.println(s1.toString() + s2.toString() + "i");
		}
		else {
			System.out.println(s1.toString() + "+" + s2.toString() + "i");
		}
	}
}

因为计算的时间很长(一开始写出的代码用几个样例测出来结果都是正确的,但是幂变成123456时半小时也跑不完),所以需要用到快速幂的方法解决。递归绕晕了看不懂啊。

四、测试次数(0/17分)

x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。

x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。

如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。
如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n

为了减少测试次数,从每个厂家抽样3部手机参加测试。

某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?

请填写这个最多测试次数。

五、快速排序(0/9分)

答案:a, i + 1, r, k - (i - l + 1)

六、递增三元组(6.8/11分)

解题思路:

直接暴力,八个测试点通过5个

代码如下:

import java.util.*;

public class a06_SanYuanZu {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] arr = new int[3][n];
		
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < n; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		
		long cnt = 0;
		for (int i = 0; i < arr[0].length; i++) {
			for (int j = 0; j < arr[1].length; j++) {
				for (int k = 0; k < arr[2].length; k++) {
					if(arr[0][i] < arr[1][j] && arr[1][j] < arr[2][k]) {
						cnt++;
					}
				}
			}
		}
		System.out.println(cnt);
	}
}

七、螺旋折线(0/19分)

解题思路:

八、日志统计(0/21分)

九、全球变暖(0/23分)

十、堆的计数(0/25分)

我们知道包含N个元素的堆可以看成是一棵包含N个节点的完全二叉树。  
每个节点有一个权值。对于小根堆来说,父节点的权值一定小于其子节点的权值。  

假设N个节点的权值分别是1~N,你能求出一共有多少种不同的小根堆吗?  

例如对于N=4有如下3种:

    1
   / \
  2   3
 /
4

    1
   / \
  3   2
 /
4

    1
   / \
  2   4
 /
3

由于数量可能超过整型范围,你只需要输出结果除以1000000009的余数。  

【输入格式】
一个整数N。  
对于40%的数据,1 <= N <= 1000  
对于70%的数据,1 <= N <= 10000  
对于100%的数据,1 <= N <= 100000

【输出格式】
一个整数表示答案。  

【输入样例】
4  

【输出样例】
3

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

十、总结

这一套是目前做到最难的,也是得分最低的(11.8),很多知识点都没学习过,但是花的时间太多啦,后面继续学习补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值