2019蓝桥杯Java决赛题答案_2019第十届蓝桥杯Java题

A.组队

题目描述:

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

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

1b48aa3b1394d3af142e55ad1a030987.png

【答案提交】

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

(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);

HashSetset=new HashSet();

String sc=in.nextLine();

for(int i=0;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表示某时刻。

182725a2a6796509c5bdae4ac3b75f72.png

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

b51d68ee7efd874f40de50749f5c481d.png

(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 map=new HashMap<>();

//第一步:先进行数据的输入,对输入的数据进行处理

for(int i=0;i

{

int ts=in.nextInt();//时刻

int id=in.nextInt();//店铺编号

if(ts

a[id][ts]++;

}

for(int i=0;i

{

for(int j=0;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.这题有点不会,也后面再补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值