【蓝桥杯】枚举,模拟,排序专题 (一)

🏠:博客首页: 进击的波吉
📕:今日分享的文章: 【蓝桥杯】枚举,模拟,排序专题 (一)
💝:坚持刷力扣,分享前三题题解🎈
🌱:Boji 还在努力学算法 ,如有疑问、疏漏之处,请多多指点🙏
☀️:自学成长的路上,感谢大家相伴!No hurry , No Pause !💝

开篇分享

⭐️距离蓝桥杯开赛不到两个月,将Acwing蓝桥杯分类专题的题目与大家分享,共同进步🏃

1210. 连号区间数

来源:第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVA B组

主要思路:
在区间 [ L, R] 里的元素,递增排序后能得到一个区间长度为 R - L +1 ;
区间程度大小 R - L +1 == j - i +1 ;

import java.util.Scanner ;

public class Main {
    static int N = 10010 ;
    static Scanner sc = new Scanner(System.in) ;
    static int[] q = new int[N] ;
    static int res = 0 ;
    public static void main(String[] args) {
        int n = sc.nextInt() ;
        for (int i =0  ;i < n; i++) q[i] = sc.nextInt() ;
        
        for (int i =0  ; i< n; i++) {
            int max1 = 0 ;
            int min1 = 10010 ;
            for (int j = i ; j <n; j++) {
                max1 = Math.max(q[j], max1) ;
                min1 = Math.min(q[j], min1) ;
                if ( max1 - min1 == j - i) res++ ;
            }   
        }
        System.out.println(res) ; 
        
    }
}

1236. 递增三元组

来源:第九届蓝桥杯省赛C++B组,第九届蓝桥杯省赛JAVA B组
主要思路:
1、acnt[i]表示在A中i这个值出现多少次,ccnt[i]表示在C中i这个值出现多少次

2、关键的一步,通过s[]记录当前数组从1到i中,所有数出现的次数的前缀和

3、as[]记录在A中由多少个数小于B[i],as[i] = s[b[i] - 1]

4、cs[]记录在C中由多少个数大于B[i], cs[i] = s[N - 1] - s[b[i]]

5、由于a[]和c[]互斥,通过乘法原理可得res += as[i] * cs[i]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
    static int N = 100010 ;
    static int[] a = new int[N] ;
    static int[] b = new int[N] ;
    static int[] c = new int[N] ;
    static int[] acnt = new int[N] ; //acnt[i] 表示A中i这个字符出现的次数 
    static int[] ccnt = new int[N] ; 
    static int[] as = new int[N] ; // 记录A中有多少个数 小于B[i] 
    static int[] cs = new int[N] ;// 记录C中有多少个数 大于B[i] 
    static int[] s = new int[N] ; //求从1到i中,所有数出现的次数的前缀和
    
    public static void main(String[] args) throws NumberFormatException, IOException  {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine().trim());
        String[] s1 = reader.readLine().split(" ");
        String[] s2 = reader.readLine().split(" ");
        String[] s3 = reader.readLine().split(" ");
        
        for (int i =1 ;i <=n; i++) a[i] = Integer.parseInt(s1[i-1]) +1 ;
        for (int i =1 ;i <=n; i++) b[i] = Integer.parseInt(s2[i-1]) +1 ;
        for (int i =1 ;i <= n; i++) c[i] = Integer.parseInt(s3[i-1]) +1 ;
        
        // as[] 
        for (int i = 1; i<= n; i++) acnt[a[i]]++ ;
        for (int i = 1; i<=N-1; i++) s[i]= s[i-1] + acnt[i] ;
        for (int i = 1; i<= n; i++) as[i] = s[b[i]-1] ;
        
        // bs[] 
        for (int i =1; i<=n ;i++) ccnt[c[i]]++ ;
        for (int i =1; i<= N-1 ;i++) s[i] = s[i-1] + ccnt[i] ;
        for (int i =1; i<= n; i++) cs[i] = s[N-1] - s[b[i]] ;
        
        // 枚举每个b[i] 
        long res= 0 ;
        for (int i = 1; i<=n; i++) res += (long)as[i] * cs[i] ;
        System.out.println(res) ; 
    }
}

1245. 特别数的和

来源:第十届蓝桥杯省赛C++B组,第十届蓝桥杯省赛JAVAB组
主要思路: 用到一个小模板
取X的每位数

while( x > 0) {
    int t = x%10 ;
     x/=10 ;
     }
import java.util.Scanner ;

public class Main {
    static int N = 100010 ;
    static Scanner sc = new Scanner(System.in) ;
    
    public static void main(String[] args) {
        int n = sc.nextInt() ;
        int res = 0 ; 
        for (int i =1 ;i<= n; i++) {
            int x = i ; 
            while ( x > 0 ) {
                int t = x%10 ; // 取出每位数
                x /= 10 ;
                if ( t == 2 || t== 0 || t== 1 || t== 9) {
                    res += i ;
                    break ; // 结束该循环
                }
            } 
        }
        
        System.out.println( res) ; 
    }
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的波吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值