2019第十届蓝桥杯省赛java b组总结
试题 A: 组队
【问题描述】
在篮球队 coaching 的过程中, 你将面临一个关键的选择:从候选名单中挑选出五名球员, 分别担任1号位至5号位, 组成球队的首发阵容. 所有球员在其在各个位置上的表现数据如表格所示. 现在, 我们需要确定何种组合能够使得这五名球员各自位置的表现总分最高.

答案提交
答案提交
答案提交
解题思路
阅读理解题。当时编写过一套算法流程,在后续分析中发现需要特别关注每个位置上的最高得分情况。具体来说,在分配资源或任务时要确保没有一个人同时承担多个职位角色。
答案:490
试题 B: 不同子串
问题描述
问题描述
答案提交
答案提交
解题思路
找出所有不同组合的字符串即可。遍历所有可能的切割位置起始点一直到切割到整个原始字符串。对于每个切割生成的新子串检查是否已存在于映射表中。如果不存在,则将其添加到映射表中。最后计算映射表中的元素数量即得出不同子串的数量。
答案:100
代码:
import java.util.HashMap;
public class topicB {
public static void main(String[] args) {
String str = "0100110001010001";
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(int i=1; i<=str.length(); i++){
for(int j=0; j+i<=str.length(); j++){
String s = str.substring(j,j+i);
if(map.containsKey(s)==false)
map.put(s, 1);
}
}
System.out.println(map.size());
}
}
java

试题 C: 数列求值
问题描述
问题描述
答案提交
解题思路
主要涉及一个三元素的一维数组连续累加操作的问题。特别强调的是最终结果仅需保留最低四位数值。因此,在每次运算后都需要对结果进行取模10000处理。
答案:4659
代码:
public class topicC {
public static void main(String[] args) {
int a[] = {1,1,1};
int n = 4;//记录项数
while((n++) <= 20190324){
int sum = 0;
for(int i=0; i<3; i++){
sum+=a[i];
}
sum%=10000;//对于千位加法 最大可能到万
a[0]=a[1];
a[1]=a[2];
a[2]=sum;
}
System.out.println(a[2]);
}
}
java

试题 D: 数的分解
问题描述
问题描述
解题思路
三个数值之和设定为...(此处应保留数学符号),因此这三个数值必须均小于等于...(此处应保留数学符号)。且不允许包含数字...(此处应保留数学符号)。可以通过生成一个包含了所有含有数字...(此处应保留数学符号)并将其存储于map变量中来实现。A组别中的不同排列被视为同一组合。已知A组别共有6种不同的排列组合。这样最终的答案即为总数除以...(此处应保留数学符号)。
答案:40785
代码:
import java.util.HashMap;
public class topicD {
public static void main(String[] args) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int sum = 0;//记录所有排列总和
for(int i=2; i<1995; i++){//将已知的2到1994包含的2,4整数保存
String s = String.valueOf(i);
char c[] = s.toCharArray();
for(int j=0; j<c.length; j++){
if('2'==c[j] || '4'==c[j]){
map.put(i, 1);
break;
}
}
}
for(int i=1; i<2000; i++){
for(int j=1; j<2000; j++){
if(i+j >= 2019) break;//两个数之和超过2019 那么之后的数必定大于2019 没有意义
if(i == j) continue;//排除相同的数
for(int k=1; k<2000; k++){
if(i+j+k == 2019){
if(i==k || j==k) break;//排除k与i、j相同的数
if(map.containsKey(i)==false && map.containsKey(j)==false && map.containsKey(k)==false){
sum++;
}
}
}
}
}
System.out.println(sum/6);
}
}
java

试题 E: 迷宫
问题描述
解题思路
emmm,终极无敌暴力大法。
这串由D、R、U等字母组成的标识符序列具有显著特征。
该标识符模式经过精心设计以确保稳定运行。
该编码方案采用了固定字符排列以实现可靠数据传输。
该序列通过复杂字母组合表达了明确的状态信息。
这种字符排列方式经过优化以提高系统效率。
该标识符模式采用固定顺序以确保信息一致性。
该字符串通过特定字符排列实现了精确状态描述。
这种编码方式经过精心安排以确保功能完整性。
代码:

试题 F: 特别数的和
样例输入
问题描述
解题思路
参考题D中所采用的数值分解方法具有相似性,在测试案例范围设定在1万以内的情况下,默认情况下需要预设并存储包含数字2、0、1以及9在内的所有整数作为索引数据
代码:
import java.util.HashMap;
import java.util.Scanner;
public class topicF {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int sum = 0;//记录满足条件的数的和。
for(int i=1; i<=10000; i++){
String s = String.valueOf(i);
char c[] = s.toCharArray();
for(int j=0; j<c.length; j++){
if('2'==c[j] || '0'==c[j] || '1'==c[j] || '9'==c[j]){
map.put(i, 1);
break;
}
}
}
int n = reader.nextInt();
for(int i=1; i<=n; i++){
if(map.containsKey(i))
sum+=i;
}
System.out.println(sum);
reader.close();
}
}
java

试题 G: 外卖店优先级
问题描述
输入格式
输出格式
样例输入
样例解释
解题思路
将输入的所有时间段依次排序。随后,在每个时间段内会对所有店铺的优先级进行减一处理。若在该时间段内存在下单记录,则会增加一。关于是否需要维护一个优先缓存的问题,在最开始我认为可以创建一个布尔类型的数组来记录各店铺的状态,并且会每分钟(或每小时)都会检查一次状态变化情况。后来经过进一步思考发现,在计算最终评分时就可以直接根据各时段的数据得出结果了。
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class topicG {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();//外卖店数量
int m = reader.nextInt();//订单数量
int t = reader.nextInt();//总时刻
int a[][] = new int[m][2];//每条订单的时刻 店号
int b[] = new int[n];//记录每个店的优先级
boolean bk[] = new boolean[n];//每个店是否在优先缓存
int sum = 0;//优先缓存的店数
for(int i=0; i<m; i++){
a[i][0] = reader.nextInt();
a[i][1] = reader.nextInt();
}
for(int i=0; i<m-1; i++){//按时刻排序
for(int j=i+1; j<m; j++){
if(a[i][0]>a[j][0]){
int tt = a[i][0];
a[i][0] = a[j][0];
a[j][0] = tt;
tt = a[i][1];
a[i][1] = a[j][1];
a[j][1] = tt;
}
}
}
ArrayList<int[]> list = new ArrayList<int[]>();
for(int i=0; i<m; i++){
list.add(a[i]);
}
for(int i=1; i<=t; i++){//每一个时刻 刷新一次外卖店的优先级
boolean key[] = new boolean[n];
for(int ii=0; ii<n; ii++){//先将所有外卖店优先级减1
if(b[ii] == 0) key[ii] = true;//为0的不减
else {
b[ii]--;
if(b[ii] <= 3)//判断是否退出缓存
bk[ii]=false;
}
}
while(list.size()!=0 && list.get(0)[0] == i){
int a1 = list.get(0)[1]-1;
if(key[a1] == false){
key[a1] = true;
b[a1]++;
}
b[a1]+=2;
if(b[a1] > 5) bk[a1]=true;//判断是否能进入缓存
list.remove(0);
}
}
for(int i=0; i<n; i++){
if(bk[i])
sum++;
}
System.out.println(sum);
reader.close();
}
}
java

试题 H: 人物相关性分析
问题描述
输入格式
输出格式
样例输入
样例输出
评测用例规模与约定
解题思路
分别定义为Alice和Bob的两个字符串,在遍历字符串每个字符的位置时依次检查以下三种情况:第一种情况是当前及接下来四个字符组成的子串与Alice完全匹配;第二种情况是当前及接下来三个字符组成的子串与Bob完全匹配;第三种情况则表示两者皆不符。当第一种或第二种情况被满足时,则需进一步判断当前拼接而成的部分前后是否有非字母字符隔开,并在此范围内检查是否存在另一个目标字符串(即Alice或Bob),同时确保前后部分也不存在字母内容。特别需要注意的是,在初始状态该字符串既不是以Alice也不是以Bob结尾的情形下(例如"Alice test Bob"这样的例子),也需要进行相应的处理步骤以确保算法的有效性
在分析题目时,请注意以下两点:
(1)数字是否计入字母中(我的观点是包括在内的)
标点符号之后紧跟字母的情况是合法的,并举例如下:
Alice Bob.Bob这一情况的答案确定为2
代码:
import java.util.HashMap;
import java.util.Scanner;
public class topicH {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
HashMap<String,Integer> map = new HashMap<String, Integer>();
//将大小写的a到z存放
for(int i=65; i<=90; i++){
map.put(String.valueOf((char)i), 1);
}
for(int i=97; i<=122; i++){
map.put(String.valueOf((char)i), 1);
}
//将数字0-9存放
for(int i=0; i<=9; i++){
map.put(String.valueOf(i), 1);
}
String sa = "Alice";
String sb = "Bob";
int sum = 0; //记录同时出现的次数
int k = reader.nextInt();
reader.nextLine();
String str = reader.nextLine();
for(int i=0; i+9<=str.length() && i<str.length(); i++){
//i+9可以不用考虑最后不足9位时出现了Alice或者Bob时 hou的substring越界问题
String s5 = str.substring(i,i+5);
String s3 = str.substring(i,i+3);
if(s5.equals(sa)){
String qian = " ";
if(i!=0)
qian = str.substring(i-1, i);//获取Alice前一个字符
String hou = str.substring(i+5,i+6);//获取Alice后一个字符
if(map.containsKey(qian)==false && map.containsKey(hou)==false){
//如果前后都不为字符
for(int j=i+6; j+3<=str.length()&&j<i+6+k; j++){
s3 = str.substring(j,j+3);
if(s3.equals(sb)){
String hou2 = " ";
if(j+3 != str.length())
hou2 = str.substring(j+3,j+4);//获取Bob后一个字符
String qian2 = str.substring(j-1, j);//获取Bob前一个字符
if(map.containsKey(qian2)==false && map.containsKey(hou2)==false){
//如果前后都不为字符
sum++;
j+=3;//可直接跳3个字符
}
}
}
}
}else if(s3.equals(sb)){
String qian = " ";
if(i!=0)
qian = str.substring(i-1, i);//获取Bob前一个字符
String hou = str.substring(i+3,i+4);//获取Bob后一个字符
if(map.containsKey(qian)==false && map.containsKey(hou)==false){
//如果前后都不为字符
for(int j=i+4; j+5<=str.length()&&j<i+4+k; j++){
s3 = str.substring(j,j+5);
if(s3.equals(sa)){
String hou2 = " ";
if(j+5 != str.length())
hou2 = str.substring(j+5,j+6);//获取Alice后一个字符
String qian2 = str.substring(j-1, j);//获取Alice前一个字符
if(map.containsKey(qian2)==false && map.containsKey(hou2)==false){
//如果前后都不为字符
sum++;
j+=5;//可直接跳3个字符
}
}
}
}
}
}
System.out.println(sum);
}
}
java

试题 I: 后缀表达式
问题描述
输入格式
输出格式
样例输入
解题思路
仅限于加减运算的情况下,在对输入的所有数值进行排序处理后采用先加总后减去的方式计算结果。(让人难以置信的是其正确性)
代码:
import java.util.Arrays;
import java.util.Scanner;
public class topicI {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int m = reader.nextInt();
int nm = n+m+1;
int a[] = new int[nm];
int sum = 0;
for(int i=0; i<nm; i++)
a[i] = reader.nextInt();
Arrays.sort(a);
for(int i=0,j=n+m; i<=n; i++,j--){
sum+=a[j];
}
for(int i=0,j=m-1; i<m; i++,j--){
sum-=a[j];
}
System.out.println(sum);
}
}
java

试题 J: 灵能传输
题目背景
问题描述
输入格式
解题思路
当时没时间写了,等过段时间有空补上。
代码:
总结
新手一枚,在此列出的所有代码均由本人亲手敲击完成(尤其是难度较大的题目),由于个人经验和能力有限(尤其是大题部分),可能存在错误或不完善之处;以上内容仅为抛砖引玉的参考思路和辅助解题代码,并非最终标准答案
