🏠:博客首页: 进击的波吉
📕:今日分享的文章:【蓝桥杯】枚举,模拟,排序专题 (一)
💝:坚持刷力扣,分享前三题题解🎈
🌱: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) ;
}
}