大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨💻,断更了整整一年,又开始恢复CSDN更新,从今天开始更新备战蓝桥30天系列,一共30天,如果对你有帮助或者正在备战蓝桥杯的小伙伴可以支持一下哦!~不能说肯定是干货,但会让你有所收获!💓💓💓
课又多,讲的又水,纯纯恶心人,不去还随机点名+位置签到,这就是我前18岁一直期盼的大学生活吗😭😭😭既浪费想真正学习的人的时间,又影响不想学习人家玩手机的体验😭😭😭
🍭🍭我们总是在生活扮演各种角色,却唯独很少扮演自己🍭🍭
山 - 蓝桥云课 (lanqiao.cn)
思路:暴力+双指针,因为有限制的回文判定,需要在判断回文的条件下再单独加些条件,因为暴力+数据太大,导致编译器要跑一段时间,很正常,比赛的时候遇到这种情况也不要慌,去看或者做下一道题,在五分钟内能跑完就是合格的代码!这段代码要跑三四分钟的,不要急。
public static void main(String[] args) {int ans = 0;for (int i = 2022; i <= 2022222022; i++) {//考虑操作一长段整数的时候转换成字符串再转换成字符数组是非常好用简单的一个思路//当然这段思路不是高效快速的,但一定好想char[] s = (i+"").toCharArray();int l = 0, r = s.length-1;boolean flag = true;while (l < r){//判断既是回文的同时就要让人家左右看来都是递增的,这个段代码不用考虑奇偶//我看CSDN很多题解都是一模一样的,没有什么非常新颖的,只能自己把自己想法写下来if(s[l+1] < s[l] || s[r-1] < s[r] || s[l] != s[r]){flag = false;break;}l++;r--;}if(flag) ans++;}System.out.println(ans);//3138}
最少刷题数 - 蓝桥云课 (lanqiao.cn)
思路:这道题是非常经典的前缀和+二分,常见的考法,比较基本也比较重要的两个算法知识,务必要掌握好,才能更好有希望冲击省一。具体细节代码上都有标注,大概就是要创建一个数组用来存储每个刷题量都有多少学生人数,并求出这个数组的前缀和,之后循环判断每一个学生刷题数是否已经满足条件用这个前缀和数组O1来查找判断,如果不满足就用二分去查找这个前缀和数组找到左边界,刷题数比他少的学生人数刚好大于等于刷题量比他多的学生人数,得到这个刷题数后减去目前已经刷的,得到还需要刷多少道题才能满足题目条件。
static int N = 100010;static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));//a存储每个同学刷题的数量,b存储的是每个刷量的个数对应学生有多少人static int[] a = new int[N];static int[] b = new int[N];public static void main(String[] args) throws IOException {String[] s = br.readLine().split(" ");int n = Integer.parseInt(s[0]);s = br.readLine().split(" ");for (int i = 0; i < n; i++) {a[i] = Integer.parseInt(s[i]);//存储下标为刷题数的学生是多少,对应++b[a[i]]++;}//对刷题数进行前缀和,可以知道刷题数的时候,等于,小于,大于该刷题数的学生是多少人//一共N最大就是1e5,我们不知道具体每个学生刷多少道题,只有个范围,只能用最大值求前缀和了for (int i = 1; i <= 100000; i++) {b[i] += b[i - 1];}//求每个学生至少还要刷多少道题可以满足 比自己刷题多的学生数 小于等于 刷题比他少的学生数for (int i = 0; i < n; i++) {//前面表示刷题量比自己多的学生 后面表示刷题量比自己少的学生,因为学生可以刷0道题,如果刷题数比自己小的学生都是刷0道题就会导致a[i-]-1为负数//b[-1]就会越界导致报错,所以要最后和0取个最大值//这个if条件就是刷题数比他少的学生数量大于等于刷题量比他多的学生,此时已经满足条件,直接输出就行了,该学生不用再刷题了if (b[100000] - b[a[i]] <= b[Math.max(0, a[i]-1)]) {out.print(0 + " ");continue;}//二分b数组找一个点,该点满足左边刷题数少的学生 刚好大于等于 右边刷题比他少的学生int l = a[i] + 1, r = 100000;while (l < r) {int mid = (l+r)>>1;//左边表示刷题数小于a[mid]的人用b[mid-1]表示,因为第一个if没进去,才到了这个循环里面,那么每次用mid查找的时候,自己就是属于刷题数小于a[mid]的人//因为要求的是数量大小的比较,自己这个时候已经被抽出去了,看要刷多少题才能插入到满足条件的地方,所以要算(左边刷题数少的学生 刚好大于等于 右边刷题比他少的学生)//的人数的时候,要把自己减掉才可以,所以左边刷题数少的学生表示为b[mid]-1if (b[mid - 1] - 1 >= b[100000] - b[mid]) r = mid;else l = mid + 1;}//还要刷多少道题out.print((r - a[i]) + " ");}out.flush();}