蓝桥杯 - 2019

1.组队

  • 题目:
      作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1号位至 5 号位的评分之和最大可能是多少?
    在这里插入图片描述

  • 解答:

  1. 思路:切记每个人只能参加在一个位置,不可重复,若重复将计算错误得到答案492。
  2. 最终答案:490,解题步骤如下所示。
号位1号位2号位3号位4号位5号位
编号110171115
成绩9799999798
  • 代码(暴力解法)
public class A {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int[][] arr = new int[20][6];
		for (int i = 0; i < 20; i++)
			for (int j = 0; j < 6; j++)
				arr[i][j] = cin.nextInt();
		int max = 0;
		for (int i = 0; i < 20; i++)
			for (int j = 0; j < 20; j++)
				for (int m = 0; m < 20; m++)
					for (int n = 0; n < 20; n++)
						for (int k = 0; k < 20; k++){
							int sum = 0;
							if(i!=j && i!=m&&i!=n&&i!=k &&j!=m&&j!=n&&j!=k&&m!=n&&m!=k&&n!=k)
								sum = arr[i][1]+arr[j][2]+arr[m][3]+arr[n][4]+arr[k][5];
							if(sum > max)
								max = sum;
						}
		System.out.println(max);
	}
}


2.不同的子串

  • 题目:
      一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。
      注意在计算时,只算本质不同的串的个数。请问,字符串0100110001010001 有多少个不同的非空子串?
  • 解答:
  1. 思路:求串的所有子集,并且所有相同的子串为一种。因为hashset会自动排除重复元素,所以将所有可能的子串都加入到hashset集合中。最后返回set集合的元素个数。
  2. 最终答案:200
  • 代码:
public class B {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		String s = cin.next();
		Set<String> set = new HashSet<String>();
		for (int i=0;i<s.length();i++){
			for(int j=i;j<s.length();j++){
				String ss = s.substring(i,j+1);
				set.add(ss);
			}
		}
		System.out.println(set);
		System.out.println(set.size());
	}
}


3.数列求值

  • 题目:
      给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3项的和。求第20190324项的最后4位数字。
  • 解答:
  1. 思路:求最后4位数字,即对10000取余。
  2. 最终答案:4659
  • 代码:
public class C {
	public static void main(String[] args) {
		int a = 1;
		int b = 1;
		int c = 1;
		for (int i=4;i<=20190324;i++){
			int temp = (a+b+c)%10000;
			a = b;
			b = c;
			c = temp;
		}
		System.out.println(c);
	}
}


4.数的分解

  • 题目:
      把2019 分解成3 个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
      注意交换3 个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。
  • 解答:
  1. 思路:

① 3个不同的正整数之和等于2019
② 每个正整数都不包含数字2和4
方法一:一种组合3个数字不同变换一种有6种,最后结果/6(缺点:运行时间太长)
方法二:i从0开始取,j从i+1开始取,k从j+1开始取,避免整数重复

  1. 最终答案:40785
  • 代码:
public class 数的分解 {
	public static Boolean judge(int k){
		char[] a = String.valueOf(k).toCharArray();
		for(int i=0;i<a.length;i++)
			if(a[i]=='2'|| a[i]=='4')
				return false;
		return true;
	}
	//方法一
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<2019;i++)
			for(int j=1;j<2019;j++)
				for(int k=1;k<2019;k++)
					if(i+j+k==2019)
						if(judge(i) && judge(j) && judge(k)){
							if(i!=j && i!=k && j!=k)
								sum++;
		System.out.println(sum/6);
	}
	//方法二
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<2019;i++)
			for(int j=i+1;j<2019;j++)
				for(int k=j+1;k<2019;k++)
					if(i+j+k==2019)
						if(judge(i) && judge(j) && judge(k)){
							if(i!=j && i!=k && j!=k)
								sum++;
		System.out.println(sum);
	}

}


6.特别数的和

  • 题目:
    【问题描述】
      小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0),在1 到40 中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。请问,在1 到n 中,所有这样的数的和是多少?
    输入:输入一行包含一个整数n。
    输出:输出一行,包含一个整数,表示满足条件的数的和。
    【样例输入】40
    【样例输出】574
  • 解答思路:
      将数字转成字符串,判断每个字符串中是否包含2、0、1、9中其中一个数字,如果有则进行累加。
  • 代码:
import java.util.Scanner;
public class 特别数的和 01{
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();
		int sum = 0;
		for(int i=1;i<=n;i++){
			int j=0;
			char[] a = String.valueOf(i).toCharArray();
			for(;j<a.length;j++)
				if(a[j]=='0'||a[j]=='2'||a[j]=='1'||a[j]=='9')
					break;
			if(j<a.length)
				sum += i;
		}
		System.out.println(sum);	
	}
}
import java.util.Scanner;
public class 特别数的和 {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();
		long sum  = 0;
		for (int i = 1; i <= n; i++){
			if(judge(i))
				sum += i;
		}
		System.out.println(sum);
	}
	public static boolean judge(int n){
		while(n != 0){
			int k = n % 10;
			if(k==2 || k==1 || k==0 || k==9)
				return true;
			n /= 10;
		}
		return false;
	}
}


7.外卖店铺优先级

  • 题目:
    【问题描述】
      “饱了么”外卖系统中维护着N家外卖店,编号1N。每家外卖店都有一个优先级,初始时(0 时刻) 优先级都为0。每经过1 个时间单位,如果外卖店没有订单,则优先级会减少1,最低减到0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加2。如果某家外卖店某时刻优先级大于5,则会被系统加入优先缓存中;如果优先级小于等于3,则会被清除出优先缓存。
    给定T 时刻以内的M 条订单信息,请你计算T 时刻时有多少外卖店在优先缓存中。
    【输入格式】
      第一行包含3 个整数N、M 和T。
      以下M 行每行包含两个整数ts 和id,表示ts 时刻编号id 的外卖店收到一个订单。
    【输出格式】
      输出一个整数代表答案。
    【样例输入】
      2 6 6
      1 1
      5 2
      3 1
      6 2
      2 1
      6 2
    【样例输出】
      1
    【样例解释】
      6 时刻时,1 号店优先级降到3,被移除出优先缓存;2 号店优先级升到6,加入优先缓存。所以是有1 家店(2 号) 在优先缓存中。
  • 代码:
package day2019;

import java.awt.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class G {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();	//n各店家
		int m = cin.nextInt(); //m条信息
		int t = cin.nextInt(); // t时刻
		int[] level = new int[n+1];	//存放优先级
		Set<Integer> set = new HashSet<Integer>();	//存放在队列的商家
		ArrayList[] array=new ArrayList[t+1]; 
		for(int i = 0; i <= t;i++)
			array[i] = new ArrayList();
		for(int i = 1; i <= m;i++){
			int ts = cin.nextInt();
			int id = cin.nextInt();
			array[ts].add(id);
		}
		for(int i = 1;i <= t; i++){
			for(int j = 1;j <= n;j++){
				Object k = j;
				int flag = 0;
				while(array[i].contains(k)){
					flag = 1;
					level[j] += 2;
					array[i].remove(k);
					if(level[j] > 5){
						set.add(j);
					}
					
				}
				if(flag == 0){
					level[j] = level[j]==0 ? 0 : level[j]-1;
					if(set.contains(j)){
						if(level[j] <= 3)
							set.remove(j);
					}
				}
			}
		}
		System.out.println(set.size());
	}
}



8.人物相关性分析

  • 题目:
    【问题描述】
      小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
    例如以下文本:
      This is a story about Alice and Bob.Alice wants to send aprivate message to Bob. 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。
    【输入格式】
      第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
    【输出格式】
      输出一个整数,表示 Alice 和 Bob 同时出现的次数。
    【样例输入】
      20 This is a story about Alice and Bob.Alice wants to send aprivate message to Bob.
    【样例输出】
      2
    【评测用例规模与约定】
      对于所有评测用例,1≤ K ≤1000000。
  • 代码①:
import java.util.Scanner;

public class 人物相关性分析 {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int k = cin.nextInt();
		// nextLine吸取回车键
		cin.nextLine();	
		String s = cin.nextLine();
		// 以空格和.分割出来,注意.空格的组合存放为空字符串
		String[] arr = s.split("\\s+|\\.");
		int sum = 0;
		// Alice------>Bob
		for(int i = 0; i < arr.length; i++){
			if(arr[i].equals("Alice")){
				int dis = 0;//记录间隔字符数量
				for(int j = i+1; j < arr.length; j++){
					if(arr[j].equals("Bob") && dis <= k)
						sum ++;
					else
						dis = dis+j-i+1+arr[j].length();
				}
			}
		}
		// Bob--------->Alice
		for(int i = 0; i < arr.length; i++){
			if(arr[i].equals("Bob")){
				int dis = 0;
				for(int j = i+1; j < arr.length; j++){
					if(arr[j].equals("Alice") && dis <= k)
						sum ++;
					else
						dis = dis+j-i+1+arr[j].length();
				}
			}
		}
		System.out.println(sum);
	}
}
  • 代码②
public class H{
    
    public static void main(String[] args)  {
        Scanner reader = new Scanner(System.in);
        int res = 0;    //save result
        int K = reader.nextInt();
        reader.nextLine();    //nextLine吸取回车键
        String str = reader.nextLine();
        String words[] = str.split("\\s+|\\.");    //以空格和.分割出来,注意.空格的组合存放为空字符串
        
        //    Alice------>Bob
        for(int i=0;i<words.length;i++){
            if(words[i].equals("Alice")){
                for(int j=i+1;j<words.length;j++){
                    if(words[j].equals("Bob")){
                        int sum=1;    //这里要等于1
                        for(int k=i+1;k<j;k++)
                            sum+=words[k].length()+1;
                        if(sum<=K)
                            res++;
                    }
                }
            }
        }
        
        //Bob--------->Alice
        for(int i=0;i<words.length;i++){
            if(words[i].equals("Bob")){
                for(int j=i+1;j<words.length;j++){
                    if(words[j].equals("Alice")){
                        int sum=1;    //这里要等于1
                        for(int k=i+1;k<j;k++)
                            sum+=words[k].length()+1;
                        if(sum<=K)
                            res++;
                    }
                }
            }
        }
        System.out.println(res);
    }   
}



9.后缀表达式

  • 题目:
    【问题描述】
     给定N 个加号、M 个减号以及N + M + 1 个整数A1; A2; ; AN+M+1,小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?请你输出这个最大的结果。
     例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。
    【输入格式】
     第一行包含两个整数N 和M。
     第二行包含N + M + 1 个整数A1; A2; ; AN+M+1。
    【输出格式】
     输出一个整数,代表答案。
    【样例输入】
     1 1
     1 2 3
    【样例输出】
     4

  • 代码:

import java.util.*;

public class 后缀表达式 {
	public static void main(String[] args) {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();
		int m = cin.nextInt();
		int[] a = new int[n+m+1];
		for(int i = 0; i < a.length; i++){
			a[i] = cin.nextInt();
		}
		Arrays.sort(a);
		int sum = 0;
		for(int i=0;i<m;i++)
			sum -= a[i];
		for(int i=m;i<n+m+1;i++)
			sum += a[i];
		System.out.println(sum);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值