目 录CONTENT

文章目录

第9届蓝桥杯题目

Stars-one
2019-03-02 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

第一题

题目说明

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);
        }
    }

}

0

评论区