花花生米

导航

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.这题有点不会,也后面再补

posted on 2020-09-08 14:00  花花生米  阅读(694)  评论(0编辑  收藏  举报