• 2019第十届蓝桥杯Java题


    A.组队

    • 题目描述:

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

    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    • (1).由题意可得,这一号到五号,不会存在与同一行,所以我们直接可找出每一列的最大两个数,然后进行选择相加得值
    • (2).或者将数据存入二维数组,for循环加判断。

    B.不同子串

    • 题目描述:

    一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。
    请问,字符串0100110001010001 有多少个不同的非空子串?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    • (1).题目中提到了不同的子串,所以我们可以选择用集合,将满足要求的组合放入集合中,最后.size()得到个数;
    • (2).用双重循环遍历,然后获取子字符串;其中用到string中的substring(i,j);
    第二题:不同字串(集合)
    public class 第十届蓝桥杯 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner in=new Scanner(System.in);
    		
    		HashSet<String>set=new HashSet<String>();
    		
    		String sc=in.nextLine();
    		for(int i=0;i<sc.length();i++)
    		{
    			for(int j=i+1;j<=sc.length();j++)
    			{
    				set.add(sc.substring(i,j));
    			}
    		}
    		System.out.println(set.size());//100
    		
    	}
    
    }
    

    C.数列求值

    题目描述:
    给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写 多余的内容将无法得分。

    • 第一眼:乍一看,每项都是前几项得和,我们可能会很快想到好像斐波那契数列,但是,这里求得是20190324项得最后四位数字
    • 发现只是求最后4位数字,这也就变相得说明了它所受到的影响只来自于相加数的末四位,所以我们可以边遍历到20190324,边加边只保留后四位,同时也不会溢出
    //第三题:数列求值
    public class 第十届蓝桥杯 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		int i=1,j=1,k=1;
    		int sum=0;
    		for(int a=4;a<=20190324;a++)
    		{
    			sum=(i+j+k)%10000;i=j;j=k;;k=sum;
    		}
    		System.out.println(sum);//4659
    	}
    }
    

    D.数的分解

    题目描述:

    把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    • (1).第一想到的是三重循环,在每一重里面都进行一个判断(是否包含数字2和4),最后一重判断相加是否等于2019;
    • (2).题目中提到各不相同,排列组合公式共六种(ABC,ACB,BAC,BCA,CAB,CBA),同时交换顺序视为一种,所以最后有也就剩ABC这一种排列方式,令j=i+1,k=j+1,可减少次数;
    第四题:数的分解
    public class 第十届蓝桥杯 {
    	
    	public static boolean fenjie(int a)
    	{
    		while(a>0)
    		{
    			if(a%10==2||a%10==4) {
    				return true;
    			}a/=10;
    			
    		}
    		return false;
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		int ans=0;
    		for(int i=1;i<2019;i++)
    		{
    			if(fenjie(i)) 
    				continue;
    			for(int j=i+1;j<2019;j++)
    			{
    				if(fenjie(j)) 
    					continue;
    				for(int k=j+1;k<2019;k++)
    				{
    					if(fenjie(k)) 
    						continue;
    					if(i+j+k==2019) {
    						ans++;
    					}
    				}
    			}
    		}
    		System.out.println(ans);//40785
    	}
    }
    

    第二种方法(字符串查找)

    • (3).后面想到可以用字符串查找的方式做
    public class 第十届蓝桥杯 {
    	public static void main(String[] args) {
    		
    		int num = 0;
    		for (int i = 1; i < 2019; i++) {
    			if ((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1)
    				continue;
    			for (int j = i + 1; j < 2019; j++) {
    				if ((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1)
    					continue;
    				for(int k=j+1;k<2019;k++)
    				{
    					if ((k+ "").indexOf("2") != -1 || (k + "").indexOf("4") != -1) {
    						continue;
    					}
    					if(i+j+k==2019)
    						num++;
    				}
    			}
    		}
    	System.out.println(num);//40785
    	}
    }
    

    F.特别的数

    时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
    【问题描述】
    小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少?
    【输入格式】
    输入一行包含两个整数 n。
    【输出格式】
    输出一行,包含一个整数,表示满足条件的数的和。
    【样例输入】 40
    【样例输出】 574
    【评测用例规模与约定】 对于 20% 的评测用例,1≤n≤10。 对于 50% 的评测用例,1≤n≤100。 对于 80% 的评测用例,1≤n≤1000。 对于所有评测用例,1≤n≤10000。

    • (1).将int转换为String,用String.indexof()判断;
    • (2).使用while循环加%和/进心计算判断
    第六题:特别数的和
    public class 第十届蓝桥杯 {
    
    	public static void main(String[] args) {
    		Scanner in=new Scanner (System.in);
    		int n=in.nextInt();int ans=0;
    		for(int i=1;i<=n;i++)
    		{
    			int a=i;
    			while(a>0)
    			{
    				if(a%10==2||a%10==0||a%10==1||a%10==9) {
    					ans+=i;break;
    				}
    				a/=10;
    			}
    		}
    		System.out.println(ans);//样例40,输出574
    	}
    }
    

    特别的数第二种方法(.indexOf())

    第六题:特别数的(字符解决方法)
    public class 第十届蓝桥杯 {
    
    	public static void main(String[] args) {
    		//先将1-n的数字转换为string,用string中的indexof();
    		Scanner in=new Scanner (System.in);
    		int n=in.nextInt();
    		int ans=0;
    		for(int i=1;i<=n;i++)
    		{
    			String ss=Integer.toString(i);
    			if(ss.indexOf("2")!=-1||ss.indexOf("0")!=-1||ss.indexOf("1")!=-1||ss.indexOf("9")!=-1)
    			{
    				ans+=i;
    			}
    		}
    		System.out.println(ans);//样例40,输出574
    	}
    }
    

    G.外卖优先级

    题目描述:
    时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
    “饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (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 号) 在优先缓存中。
    【评测用例规模与约定】 对于 80% 的评测用例,1≤ N,M,T ≤10000。 对于所有评测用例,1≤ N,M,T ≤100000,1≤ts≤T,1≤id ≤ N

    • (1).对数据进行处理:设置一个二维数组a[i][j],i表示店铺的编号,j表示某时刻。

    • (2).循环输入ts,id,相对应a[id][ts]++,表示此时刻有订单;设置一个表示优先缓存店铺数组ans[i],通过对ans[i]的不同操作引起值的变化

    • (2).1.当a[i][j]==1的时候,则对其ans[i]+=a[i][j]*2;否则ans[i]=Math.max(0,ans[i]-1)
    //第五题:外卖优先级
    public class 第十届蓝桥杯 {
    
    	public static void main(String[] args) {
    		Scanner in=new Scanner (System.in);
    		int N=in.nextInt();int M=in.nextInt();int T=in.nextInt();
    		int [][]a=new int[N+1][M+1];
    		int []ans=new int[N+1];
    		HashMap<Integer,Integer> map=new HashMap<>();
    		//第一步:先进行数据的输入,对输入的数据进行处理
    		for(int i=0;i<M;i++)
    		{
    			int ts=in.nextInt();//时刻
    			int id=in.nextInt();//店铺编号
    			if(ts<T)
    				a[id][ts]++;
    		}
    		for(int i=0;i<N;i++)
    		{
    			for(int j=0;j<T;j++)
    			{
    				if(a[i][j]==1)
    					ans[i]+=a[i][j]*2;
    				else ans[i]=Math.max(0, ans[i]-1);
    				if(ans[i]>5)
    					map.put(i,1);
    				if(ans[i]<=3)
    					map.remove(i);
    			}
    		}
    		System.out.println(map.size());
    	}
    }
    

    I.卡在思考第三种情况,后面想通了补

    J.这题有点不会,也后面再补

    作者:Better又
    出处:https://www.cnblogs.com/lwyy1223-/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    phpStudy The requested URL /web/index.php was not found on this server
    python yield 理解与用法
    python 高阶函数之 map
    python 高阶函数之 reduce
    java extends和implements区别
    SpringMVC中使用Interceptor拦截器顺序
    SpringMVC 拦截器使用说明
    java session创建与获取
    跨域解决方案
    nrm -- 一键切换npm源
  • 原文地址:https://www.cnblogs.com/lwyy1223-/p/13632171.html
Copyright © 2020-2023  润新知