一、第几天(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),很多知识点都没学习过,但是花的时间太多啦,后面继续学习补充。