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

裁纸刀

原题链接

裁纸刀

问题描述

todo:这里复制题目描述

解题思路

找规律,首先需要裁掉纸的边缘 4 刀,再看横向的,要裁 行数 - 1 刀,纵向的每一行都要裁掉 列数 - 1 刀。

参考代码

import java.io.*;
import java.util.*;
public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    
    public static void main(String[] args) throws Exception {
    	
    	out.println(4 + (20 - 1) + (21 * 20));


        out.flush();
        in.close();
    }
}

刷题统计

原题链接

刷题统计

问题描述

todo:这里复制题目描述

解题思路

数据范围很大,需要把一个周的刷题量看作一个整体来计算。

参考代码

import java.io.*;
import java.util.*;
public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    
    public static void main(String[] args) throws Exception {
    		
    	String[] s = in.readLine().split(" ");
    	long a = Long.parseLong(s[0]), b = Long.parseLong(s[1]), p = Long.parseLong(s[2]);
    	// 一周的刷题数量
    	long weekCnt = a * 5 + b * 2;
    	// 刷题的周数
    	long weekSum = p / weekCnt;
    	// 当前刷题天数
    	long ans = weekSum * 7;
    	// 剩余的题目
    	p %= weekCnt;
    	// 当前是星期一
    	int cur = 1;
    	while (p > 0) {
    		p -= cur <= 5? a: b;
    		cur++;
    		ans++;
    	}
    	out.println(ans);

        out.flush();
        in.close();
    }
}

修剪灌木

原题链接

修剪灌木

问题描述

todo:这里复制题目描述

解题思路

对于当前第 i 棵树,再修剪完之后下一次修剪的时间从两边取一个最大值即可,可以发现是左右对称的,计算左边再对称右边即可,省去了判断大小。

参考代码

import java.io.*;
public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    
    public static void main(String[] args) throws Exception {
    		
    	int n = Integer.parseInt(in.readLine());

    	int mid = n / 2;
    	for (int i = 1; i <= mid; i++) {
    		out.println((n - i) * 2);
    	}
    	
    	if ((n & 1) == 1) out.println((n - mid - 1) * 2);
    	
    	for (int i = mid; i >= 1; i--) {
    		out.println((n - i) * 2);
    	}
        out.flush();
        in.close();
    }
}

k倍区间

原题链接

k倍区间

问题描述

todo:这里复制题目描述

解题思路

前缀和 + 哈希表
很经典的套路题了,不了解的可以去看这两道题的灵神的题解
面试题 17.05. 字母与数字
2588. 统计美丽子数组数目

参考代码

import java.io.*;
import java.util.*;
public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    
    static int N = (int)1e5 + 10, n, k;
    static int[] a = new int[N], pre = new int[N];
    static Map<Integer, Integer> map = new HashMap<>();
    
    public static void main(String[] args) throws Exception {
    	String[] s = in.readLine().split(" ");
    	n = Integer.parseInt(s[0]);
    	k = Integer.parseInt(s[1]);
    	for (int i = 1; i <= n; i++) {
    		a[i] = Integer.parseInt(in.readLine());
    		pre[i] = (pre[i - 1] + a[i]) % k;
    	}
    	long ans = 0L;
    	for (int i = 0; i <= n; i++) {
    		ans += map.getOrDefault(pre[i], 0);
    		map.put(pre[i], map.getOrDefault(pre[i], 0) + 1);
    	}
    	
    	out.println(ans);
 	
        out.flush();
        in.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值