当前位置:   article > 正文

第十届蓝桥杯省赛真题_蓝桥杯计算思维真题

蓝桥杯计算思维真题

前五道结果填空,后五道编程题

目录

前五道结果填空,后五道编程题

A:组队

B:不同子串

C:数列求值

D:数的分解

 E:迷宫

F:特别数的和

输入描述

输出描述

输入输出样例

G:外卖店优先级

输入描述

输出描述

输入输出样例

H:人物相关性分析

I:后缀表达式

J:灵能传输


A:组队

作为篮球队教练,你需要从以下名单中选出 1号位至 5 号位各一名球员,组成球队的首发阵容。

每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1号位至 5 号位的评分之和最大可能是多少?

 

可以用肉眼看计算,或者暴力的查找一下,答案就是460

B:不同子串

一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如,字符串 aaab有非空子串 a, b, aa, ab, aaa, aab, aaab,一共 7 个。注意在计算时,只算本质不同的串的个数。

请问,字符串 0100110001010001 有多少个不同的非空子串?

这个的话,也是直接暴力,把所有的子串都找出来,而且TreeSet是不会添加重复结构的,所以就直接利用,得出长度即是答案100

  1. String str="0100110001010001";
  2. Set<String> set=new TreeSet<>();
  3. int length=str.length();
  4. for(int i=0;i<length;i++) {
  5. for(int j=i+1;j<=length;j++) {
  6. String str2=str.substring(i, j);
  7. //注意这个函数 左闭右开 而且当start与end相同的时候是一个空
  8. System.out.println("str2----"+str2);
  9. set.add(str2);
  10. }
  11. }
  12. /*
  13. for(String s:set) {//看一下所有的结构
  14. System.out.println(s);
  15. }*/
  16. System.out.println(set.size());

C:数列求值

给定数列 1,1,1,3,5,9,17,⋯从第 4项开始,每项都是前 3 项的和。

求第 20190324 项的最后 444 位数字。

这道题。。题意就是题意。。。只不过想要计算到20190324确实是一个非常非常大的数,一般情况下都是计算不到的,得出的不会是我们想要的结果。通过题意可以知道,我们只需要后4位,而且是求和,就意味着前面的任何数字对后面都没有什么影响,所有只要后四位参与运算就行了

  1. int a1=1;
  2. int a2=1;
  3. int a3=1;
  4. int a=0;
  5. for(int i=4;i<=20190324;i++){
  6. a=(a1+a2+a3)%10000;
  7. a1=a2;
  8. a2=a3;
  9. a3=a;
  10. ;
  11. }
  12. System.out.println(a);
  13. System.out.println("4659");

D:数的分解

把 2019分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2和 4,一共有多少种不同的分解方法?

注意交换 333 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。

这道题的话,要保证三个数和为2019,并且不含‘2’‘4’,都比较好实现,唯一关键的一点是要保持没有因为顺序而导致的重复,思路在代码。

  1. public static void main(String[] args) {
  2. int count=0;
  3. for(int i=1;i<2018;i++) {
  4. for(int j=i+1;j<1009;j++) {//让i和j之间保持没有顺序重复
  5. int p=2019-i-j;
  6. if(p>j&&panduan(i)&&panduan(j)&&panduan(p)) {
  7. //需要让p大于j 可以保证没有p和j的顺序导致的重复
  8. count++;
  9. }
  10. }
  11. }
  12. System.out.println(count);
  13. }
  14. //检查是否有数字2 和 4
  15. public static boolean panduan(int num) {
  16. String str=""+num;
  17. boolean flag1= str.contains("2");
  18. boolean flag2= str.contains("4");
  19. if(flag1||flag2) {//有一个包含就会返回false
  20. return false;
  21. }else {
  22. return true;
  23. }
  24. }

 E:迷宫

F:特别数的和

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 n 中,所有这样的数的和是多少?

输入描述

输入格式:

输入一行包含两个整数 n(1≤n≤10^4)。

输出描述

输出一行,包含一个整数,表示满足条件的数的和。

输入输出样例

示例

输入

40

输出

574

难度又从峰值掉下来了,本题也是暴力直接做

  1. public static void main(String[] args) {
  2. Scanner scan = new Scanner(System.in);
  3. //在此输入您的代码...
  4. int n=scan.nextInt();
  5. int count=0;
  6. for(int i=1;i<=n;i++) {
  7. if(panduan(i)) {
  8. count+=i;
  9. }
  10. }
  11. System.out.println(count);
  12. scan.close();
  13. }
  14. //是否包含2 0 1 9
  15. public static boolean panduan(int num) {
  16. String str=""+num;
  17. if(str.contains("2")||str.contains("0")||str.contains("1")||str.contains("9")) {
  18. return true;
  19. }
  20. return false;
  21. }

G:外卖店优先级

"饱了么"外卖系统中维护着 N家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。

每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。

给定 T 时刻以内的 M 条订单信息,请你计算 T时刻时有多少外卖店在优 先缓存中?

输入描述

第一行包含 3 个整数 N,M,T。

以下 M 行每行包含两个整数 ts,id,表示 ts时刻编号 id的外卖店收到一个订单。

其中,1≤N,M,T≤105,1≤ts≤T,1≤id≤N

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

  1. 2 6 6
  2. 1 1
  3. 5 2
  4. 3 1
  5. 6 2
  6. 2 1
  7. 6 2

输出

1

样例解释:

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。

这道题也是差不多暴力的情况,主要的问题是怎么去存储数据使用数据,但是有点耗时间了,如果都用int[]的话应该也能做int[][],逻辑都在代码里

  1. public static void main(String[] args) {
  2. Scanner scan = new Scanner(System.in);
  3. int N=scan.nextInt();//N家店
  4. int M=scan.nextInt();//M条信息
  5. int T=scan.nextInt();//T个时刻
  6. int count=0;
  7. //key 家店的情况
  8. Map<Integer,ArrayList<Integer>> map=new HashMap<>();
  9. for(int i=1;i<=M;i++) {//记录M条信息
  10. int ts=scan.nextInt();//时刻
  11. int id=scan.nextInt();//店id
  12. if(map.containsKey(id)) {//如果已有这家店的记录
  13. map.get(id).add(ts);//允许重复
  14. }else {//如果没有这个店的记录的话 需要初始化一下
  15. ArrayList<Integer> list=new ArrayList<>();
  16. list.add(ts);
  17. map.put(id, list);
  18. }
  19. }
  20. //System.out.println(map);//检查信息是否正确
  21. int num=0;//记录最终结果
  22. for(Integer dian:map.keySet()) {//遍历所有店
  23. int[] jilu=new int[T+1];//用于记录一家店所有时刻的情况
  24. for(int i=0;i<map.get(dian).size();i++) {
  25. Integer t=map.get(dian).get(i);
  26. jilu[t]+=1;//包括记录一个时刻有多个订单的情况
  27. }
  28. int jishu=0;//优先级数
  29. boolean flag=false;//是否是优先
  30. for(int i:jilu) {
  31. if(i>0) {//有订单
  32. jishu+=2*i;
  33. if(jishu>5) {
  34. flag=true;
  35. }
  36. }else {//没有
  37. jishu--;
  38. if(jishu<=3) {
  39. flag=false;
  40. }
  41. if(jishu<0) {//不能减到0以下
  42. jishu=0;
  43. }
  44. }
  45. }
  46. if(flag) {
  47. num++;
  48. }
  49. }
  50. System.out.println(num);
  51. scan.close();
  52. }

(代码贴到这里都tab都岔开的厉害)

H:人物相关性分析

I:后缀表达式

给定 N个加号、M 个减号以及 N+M+1 个整数 A_1,A_2,··· ,A_{N+M+1}小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1个整数凑出的合法的 后缀表达式中,结果最大的是哪一个?

请你输出这个最大的结果。

例如使用 1 2 3 + -,则 "2 3 + 1 -" 这个后缀表达式结果是 4,是最大的。

输入描述

第一行包含两个整数 N,M

第二行包含 N+M+1 个整数 A_1,A_2,··· ,A_{N+M+1}。

其中,0≤N,M≤105,−109≤Ai≤1090。

输出描述

输出一个整,代表答案。

输入输出样例

示例

输入

  1. 1 1
  2. 1 2 3

输出

4

这道题主要的难点在判断各种组成的情况,数据的情况,安排的情况。。。。后缀表达式只是一个添头了。。。。后缀表达式可以看力扣150题。

  1. public static void main(String[] args) {
  2. int m,n;
  3. Scanner scanner=new Scanner(System.in);
  4. m=scanner.nextInt();
  5. n=scanner.nextInt();
  6. boolean x=false,y=false;//判断正负数是否存在
  7. int length=m+n+1;
  8. int[] a=new int[length];
  9. a[0]=scanner.nextInt();//第一个数
  10. int max=a[0];
  11. int min=a[0];
  12. if(a[0]>0) x=true;
  13. else if(a[0]<0) y=true;
  14. for(int i=1;i<length;i++) {
  15. a[i]=scanner.nextInt();
  16. if(min>a[i]) min=a[i];
  17. if(max<a[i]) max=a[i];
  18. if(a[i]>0) x=true;
  19. else if(a[i]<0) y=true;
  20. }
  21. long num=0;
  22. if(n==0) {//-号个数为0,所有数之和
  23. for(int i=0;i<length;i++)
  24. num+=a[i];
  25. }
  26. else if(m==0) {//+号个数为0
  27. if(x&&y) {//正负数都存在
  28. for(int i=0;i<length;i++)
  29. num+=Math.abs(a[i]);
  30. }
  31. else if(x&&!y) {//全正数
  32. for(int i=0;i<length;i++)
  33. num+=a[i];
  34. num=num-2*min;
  35. }
  36. else if(!x&&y) {//全负数
  37. for(int i=0;i<length;i++)
  38. num-=a[i];
  39. num=num+2*max;
  40. }
  41. }
  42. else {//有+、-号
  43. if(x&&y) {//正负数都存在
  44. for(int i=0;i<length;i++)
  45. num+=Math.abs(a[i]);
  46. }
  47. else if(x&&!y) {//全正数
  48. for(int i=0;i<length;i++)
  49. num+=a[i];
  50. num=num-2*min;
  51. }
  52. else if(!x&&y) {//全负数
  53. for(int i=0;i<length;i++)
  54. num-=a[i];
  55. num=num+2*max;
  56. }
  57. }
  58. System.out.println(num);
  59. }

J:灵能传输

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号