第十四届蓝桥杯三月真题刷题训练——第 10 天

目录

第 1 题:裁纸刀

问题描述

运行限制

代码:

第 2 题:刷题统计

问题描述

输入格式

输出格式

样例输入

样例输出

评测用例规模与约定

运行限制

代码:

第 3 题:修建灌木

 问题描述

输入格式

输出格式

样例输入

样例输出

评测用例规模与约定

运行限制

代码:

第 4 题:k倍区间(朴素版)

题目描述

输入描述

输出描述

输入输出样例

运行限制

代码:


第 1 题:裁纸刀

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。

小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法。

在上面的例子中,小蓝的打印机没办法打印到边缘,所以边缘至少要裁 4 次。另外,小蓝每次只能裁一张纸,不能重叠或者拼起来裁。

如果小蓝要用一张纸打印出 20 行 22 列共 440 个二维码,他至少需要裁多少次?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

代码:

找规律,可以一次性剪一行,但是列的话只能一个一个减!!

n行m列

按行剪:n-1

按列剪:(m-1)*n

周边剪:4

package 第十四届蓝桥杯三月真题刷题训练.day10;

import java.io.*;

/**
 * @author yx
 * @date 2023-03-13 8:37
 */
public class 裁纸刀 {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    public static void main(String[] args) throws IOException {
        in.nextToken();
        int n=(int)in.nval;
        in.nextToken();
        int m=(int)in.nval;
        //找规律
        System.out.println((n-1)+(n)*(m-1)+4);
    }
}

第 2 题:刷题统计

问题描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a,b 和 n.

输出格式

输出一个整数代表天数。

样例输入

10 20 99

样例输出

8

评测用例规模与约定

对于 50% 的评测用例, 1≤a,b,n≤10^6

对于 100% 的评测用例, 1≤a,b,n≤10^18

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

代码:

package 第十四届蓝桥杯三月真题刷题训练.day10;

import java.io.*;
import java.util.Scanner;

/**
 * @author yx
 * @date 2023-03-13 8:52
 */
public class 刷题统计_long {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    //十年IO一场空不开longlong见祖宗
    public static void main(String[] args) throws IOException {
//        in.nextToken();
//        long a=(long) in.nval;
//        in.nextToken();
//        long b=(long) in.nval;
//        in.nextToken();
//        long n=(long) in.nval;
        Scanner scanner = new Scanner(System.in);
        long a=scanner.nextLong();
        long b=scanner.nextLong();
        long n=scanner.nextLong();
        long day=0;
        long temp=n%(5*a+2*b);
        long temp2=0;
        day=n/(5*a+2*b)*7;
//        if(temp!=0) {
//            if(temp<=5*a){
//                if(temp%a!=0){
//                    day+=(temp/a+1);
//                }else {
//                    day+=temp/a;
//                }
//            }else {
//                day+=5;
//                temp-=5*a;
//                if(temp-b<=0){
//                    day+=1;
//                }else {
//                    day+=2;
//                }
//            }
//        }
        long[] nums=new long[]{a,a,a,a,a,b,b};
        int i=0;
        if(temp!=0){
            while (true){
                temp2+=nums[i];
                day++;
                i++;
                if(temp2>=temp){
                    out.println(day);
                    out.flush();
                    return;
                }
            }
        }else {
            out.println(day);
            out.flush();
        }
//        out.flush();
    }
}

第 3 题:修建灌木

 问题描述

爱丽丝要完成一项修剪灌木的工作。

有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。

灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的 早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

输入格式

一个正整数 N, 含义如题面所述。

输出格式

输出 N 行, 每行一个整数, 第 i 行表示从左到右第 i 棵树最高能长到多高。

样例输入

3

样例输出

4
2
4

评测用例规模与约定

对于 30% 的数据, N≤10.

对于 100% 的数据, 1<N≤10000.

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

代码:

找规律,画个图就能理解,So easy!!

package 第十四届蓝桥杯三月真题刷题训练.day10;

import java.io.*;

/**
 * @author yx
 * @date 2023-03-13 9:51
 */
public class 修剪灌木 {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    public static void main(String[] args) throws IOException {
        in.nextToken();
        int N=(int) in.nval;
        for (int i = 1; i <= N; i++) {
            out.println(Math.max((N-i)*2,(i-1)*2));
        }
        out.flush();
    }
}

第 4 题:k倍区间(朴素版)

题目描述

给定一个长度为 N 的数列,A1,A2,⋯AN​,如果其中一段连续的子序列 Ai,Ai+1,⋯Aj( i≤ji≤j ) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。

你能求出数列中总共有多少个 K 倍区间吗?

输入描述

第一行包含两个整数 N 和 K( 1≤N,K≤10^5 )。

以下 N 行每行包含一个整数 AiAi​ ( 1≤Ai≤10^5 )

输出描述

输出一个整数,代表 K 倍区间的数目。

输入输出样例

示例

输入

5 2
1
2
3
4
5

输出

6

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 256M

代码:

package 第十四届蓝桥杯三月真题刷题训练.day10;

import java.io.*;
import java.util.Scanner;

/**
 * @author yx
 * @date 2023-03-13 10:15
 */
public class k倍区间_同余定理_long类型转换 {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    public static void main(String[] args) throws IOException {
//        in.nextToken();
//        int N=(int) in.nval;
//        in.nextToken();
//        int K=(int) in.nval;
        Scanner scanner = new Scanner(System.in);
        int N=scanner.nextInt();
        int K=scanner.nextInt();
        long ans=0;
        long[] nums=new long[K];//存余数的数组
        long sum=0;
        int temp=0;
        for (int i = 0; i < N; i++) {
            temp=scanner.nextInt();
            sum+=temp;
            /*
            sum%K 不加阔号会显示段错误
             */
//            nums[(int) sum%K]++;
            nums[(int) (sum%K)]++;
        }
        //余数为0的可以自己单独构成一个K倍区间
        ans+=nums[0];
        /*
        有x个前缀和相同的一个余数,一共能构成x(x-1)/2个K倍数区间
        K=5
        注意:这里的Xi指的是前i个总和
        X1=3;
        X2=8;
        X3=13
        K倍区间[X1,x2],[x1,x3],[x2,x3]
         */
        for (int i = 0; i <K ; i++) {
            ans+=((nums[i]-1)*nums[i])/2;
        }
        out.println(ans);
        out.flush();
    }
}

猜你喜欢

转载自blog.csdn.net/m0_55858611/article/details/129484484
今日推荐