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-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。