第一题
题目说明
2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天?
解题
需要注意的是闰年的条件
(year%4==0 && year%100!=0) || year%400==0
答案
1,3月有31天 ,2月有28天,4月有30天
31*2+30+28+4=125
第二题
题目说明
在二维平面上有无数个1x1的小方格。
我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。 你能计算出这个圆里有多少个完整的小方格吗?

解题
以中间的原点为开始,分为四个部分,也就是四个象限,我们看第一象限(也就是右上角那部分四分之一圆弧)
我们从A点开始,改变A点的纵坐标,计算A点与原点的距离。
如果小于圆的半径,就得到一个正方形,如果大于圆的半径,则停止、
之后把A的横坐标加一,继续从循环

这样的话我们就找到一个象限的方格数,之后需要获得四个象限,乘以一个4即可获得答案
答案
private static int work2(int n) {
int cout = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int d = i * i + j * j;
if (d <= n * n) {
cout++;
}
}
}
return cout * 4;
}
答案为3137548
第三题
题目说明
设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。 求 (2+3i)^123456 等于多少?
即(2+3i)的123456次幂,这个数字很大,要求精确表示。
答案写成 "实部±虚部i"的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号
(2+3i)^2 写成: -5+12i,
(2+3i)^5 的写成: 122-597i
解题
第六题
题目
给定三个整数数组 A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2,... CN],
请你统计有多少个三元组(i, j, k) 满足:
1 <= i, j, k <= N
Ai < Bj < Ck
【输入格式】 第一行包含一个整数N。 第二行包含N个整数A1, A2, ... AN。 第三行包含N个整数B1, B2, ... BN。
第四行包含N个整数C1, C2, ... CN。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <=100000 0 <= Ai, Bi, Ci <= 100000
【输出格式】 一个整数表示答案
【输入样例】
3
1 1 1
2 2 2
3 3 3
【输出样例】
27
解题
import java.util.Arrays;
import java.util.Scanner;
/**
* Create by Stars-One on 2019-3-1 0001
* 给定三个整数数组 A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2,
* ... CN], 请你统计有多少个三元组(i, j, k) 满足:
*
* 1 <= i, j, k <= N
* Ai < Bj < Ck
* 【输入格式】 第一行包含一个整数N。 第二行包含N个整数A1, A2, ... AN。 第三行包含N个整数B1, B2, ... BN。
* 第四行包含N个整数C1, C2, ... CN。
*
* 对于30%的数据,1 <= N <= 100
* 对于60%的数据,1 <= N <= 1000
* 对于100%的数据,1 <= N <=
* 100000 0 <= Ai, Bi, Ci <= 100000
*
* 【输出格式】 一个整数表示答案
*
* 【输入样例】
* 3
* 1 1 1
* 2 2 2
* 3 3 3
*
* 【输出样例】
* 27
*
* 资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 1000ms
*
* 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
*所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
* 不要使用package语句。不要使用jdk1.7及以上版本的特性。 主类的名字必须是:Main,否则按无效代码处理。
*/
class Subject5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();//每行有N个整数
scanner.nextLine();
//获得数据
int[] A = new int[N];
int[] B = new int[N];
int[] C = new int[N];
for (int i = 0; i < 3; i++) {
String s = scanner.nextLine();
String[] temp = s.split(" ");
if (i == 0) {
for (int j = 0; j < temp.length; j++) {
A[j] = Integer.parseInt(temp[j]);
}
} else if (i == 1) {
for (int j = 0; j < temp.length; j++) {
B[j] = Integer.parseInt(temp[j]);
}
} else if (i == 2) {
for (int j = 0; j < temp.length; j++) {
C[j] = Integer.parseInt(temp[j]);
}
}
}
long start = System.currentTimeMillis();
//对三个数据进行排序
Arrays.sort(A);
Arrays.sort(B);
Arrays.sort(C);
int[] count = new int[N];//存放A数组每个数之下符合条件的数目,之后只需要将此数组之和输出即可得到结果
for (int i = 0; i < A.length; i++) {
int indexB = find(B, A[i]);//找到符合B数组中大于A[i]的最小坐标,剩余的都是满足条件的,个数为N-indexB
if (indexB == -1) {
break;//找不到结果了
} else {
for (int j = indexB; j <N ; j++) {
int indexC = find(C,B[indexB]);
if (indexC == -1) {
break;
}
count[i] = count[i] + N - indexC;
}
}
}
//计算结果
int sum = 0;
for (int i = 0; i < count.length; i++) {
sum +=count[i];
}
System.out.println(sum);
long end = System.currentTimeMillis(); // 记录结束时间
System.out.println(end-start);
}
private static int find(int[] temp, int x) {
if (x > temp[temp.length - 1]) {
return -1;
}
if (x < temp[0]) {
return 0;
}
return find(temp, 0, temp.length, x);
}
private static int find(int[] temp, int start, int end, int x) {
if (end - start == 1) {
return end;//后一个肯定比前一个大,返回后一个,start已经比较过了,temp[start]比x要小
}
int mid = (start + end) / 2;
if (x < temp[mid]) {
return find(temp, start, mid, x);
} else {
if (x == temp[mid]) {
return mid+1;//找到了当前的数,之后的那个数肯定比当前的数大点
}
return find(temp, mid, end, x);
}
}
}
评论区