第十届蓝桥杯java省赛大学生C组

第十届蓝桥杯java省赛大学生C组,第1张

A.求和

小明对数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。



请问,在1到2019中,所有这样的数的和是多少?
 

参考代码
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        int res = 0;
        ArrayList list = new ArrayList<>();
        list.add(2);
        list.add(0);
        list.add(1);
        list.add(9);
        for(int i = 1; i < 2020; i++){
          int n = i;
          while(n > 0){
            if(list.contains(n % 10)){
              res += i;
              break;
            }
            n = n / 10;
          }
        }
        System.out.println(res);
    }
}
B.矩形切割

小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。



当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。



例如,对于一块两边分别为5和3的材料(记为5×3),小明会依次切出3×3、2×2、1×1、1×1共4个正方形。



现在小明有一块矩形的材料,两边长分别是2019和 324。


请问小明最终会切出多少个正方形?
 

参考代码
package lanqiaobei_10;


	import java.util.Scanner;
	
	public class 矩形切割 {
	 public static void main(String[] args) {
	     int a = 2019;
	     int b = 324;
	     int count = 0;
	     while (b>0) {
	        if (a>b) {
	            a = a-b;
	            count++;
	        }else {
	            b = b-a;
	            count++;
	        }
	    }
	     System.out.println(count);
	 }
	}
	
	

C.不同子串

一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。


例如,字符串aaab有非空子串a,b, aa,ab,aaa,aab, aaab,一共7个。


注意在计算时,只算本质不同的串的个数。



请问,字符串0100110001010001有多少个不同的非空子串?
 

参考代码
package lanqiaobei_10;


	import java.util.Scanner;
	import java.util.Set;
	import java.util.HashSet;
	
	public class 不同子串 {
	    public static void main(String[] args) {
	        Scanner scan = new Scanner(System.in);
	        
	        Set S = new HashSet<>();
	        String s = "0100110001010001";
	        for(int i = 0; i < s.length(); i++) {
	          for(int j = i + 1; j <= s.length(); j++) {
	            String t = s.substring(i, j);
	            S.add(t);
	          }
	        }
	        System.out.print(S.size());
	        scan.close();
	    }
	}
	
	

D.质数

我们知道第一个质数是2、第二个质数是3、第三个质数是5……请你计算第2019个质数是多少?
 

参考代码  
package lanqiaobei_10;


	import java.util.Scanner;


	
	
	   

	    	public class 质数 {
	    	    public static void main(String[] args) {
	    	        Scanner scan = new Scanner(System.in);
	    	       
	    	        boolean flag;
	    	        int sum=0;
	    	        for(int i=2;i<2000000000;i++)
	    	        {
	    	            flag = true;
	    	            for(int j=2;j<=Math.sqrt(i);j++)
	    	            {
	    	                if(i%j==0)
	    	                {
	    	                    flag = false;
	    	                    break;
	    	                }
	    	            }
	    	            if(flag)
	    	            {
	    	                sum++;
	    	                if(sum==2019)
	    	                {
	    	                    System.out.println(i);
	    	                    break;
	    	                }
	    	            }
	    	        }
	    	        scan.close();
	    	    }
	    	}
E.最大降雨量

由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。


这个法术需要用到他手中的49张法术符,上面分别写着1至49这49个数字。


法术一共持续7周,每天小明都要使用一张法术符,法术符不能重复使用。



每周,小明施展法术产生的能量为这周7张法术符上数字的中位数。


法术施展完7周后,求雨将获得成功,降雨量为7周能量的中位数。



由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
 

参考代码  
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        

        // x x x x  22 23 24 25
        // x x x x  26 27 28 29 
        // x x x x  30 31 32 33
        // x x x x |34| 35 36 37
        // x x x x  38 39 40 41 
        // x x x x  42 43 44 45
        // x x x x  46 47 48 49
        //把最大的全部放在后面追求数值最大化,根据中位数要求拿到34答案
        System.out.print(34);
        scan.close();
//可以数学思维立刻得出答案  没必要java输出
    }
}
F.旋转

图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转90度。



我们用一个nxm的二维数组来表示一个图片,例如下面给出一个3×4 的图片的例子:
1357
9 8 7 6

3 59 7
这个图片顺时针旋转90度后的图片如下:
3 9 1
58 3

975

7 6 7
给定初始图片,请计算旋转后的图片。



 

参考代码  
package lanqiaobei_10;




	import java.util.Scanner;
	
	public class 旋转 {
	    public static void main(String[] args) {
	        Scanner scanner = new Scanner(System.in);
	        int n = scanner.nextInt();
	        int m = scanner.nextInt();
	        int arr[][] = new int[n][m];
	        for (int i = 0; i < n; i++) {               // n行
	            for (int j = 0; j < m; j++) {           // m列
	                arr[i][j] = scanner.nextInt();      // 输入数据
	            }
	        }
	        for (int i = 0; i < m; i++) {               // 旋转后变成 m行
	            for (int j = n - 1; j >= 0; j--) {      // n列
	                System.out.print(arr[j][i] + " ");  // 打印输出
	            }
	            System.out.println();
	        }


	    }
	}
G.外卖店优先级


“饱了么”外卖系统中维护着Ⅳ家外卖店,编号1~N。


每家外卖店都有一个优先级,初始时(O时刻)优先级都为0。



每经过1个时间单位,如果外卖店没有订单,则优先级会减少1,最低减到0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加2。



如果某家外卖店某时刻优先级大于5,则会被系统加入优先缓存中;如果优先级小于等于3,则会被清除出优先缓存。



给定T时刻以内的M条订单信息,请你计算T时刻时有多少外卖店在优先缓存中。



 

参考代码  
package lanqiaobei_10;



	
		import java.util.ArrayList;
		import java.util.Scanner;

		public class 外卖店优先级 {
		    public static void main(String[] args) {
		        Scanner scanner = new Scanner(System.in);
		        int n = scanner.nextInt();
		        int m = scanner.nextInt();
		        int t = scanner.nextInt();
		        ArrayList> list = new ArrayList<>();
		        for (int i=0; i());
		        }
		        for (int i=0; i myList = list.get(i);
		            boolean[] hasOrder = new boolean[n];
		            for (int j=0; j 5){
		                    isQueue[myList.get(j)-1] = true;
		                }
		                hasOrder[myList.get(j)-1] = true;
		            }
		            for (int x=0; x
H.人物相关性分析

小明正在分析一本小说中的人物相关性。


他想知道在小说中Alice和 Bob有多少次同时出现。



更准确的说,小明定义Alice和 Bob“同时出现”的意思是:在小说文本中Alice和 Bob之间不超过K个字符。



例如以下文本:
This is a story about Alice and Bob.Alice wants to send a private message to Bob.
假设K = 20,则Alice和 Bob同时出现了2次,分别是”Alice and Bob”和”Bob. Alice”。


前者Alice和 Bob之间有5个字符,后者有2个字符。



注意:
1. Alice和 Bob是大小写敏感的,alice或bob 等并不计算在内。



2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能有字母。


例如 Bobbi亚不算出现了Bob。



 

参考代码  
package lanqiaobei_10;


	import java.util.*;
	/*
	 * 
	 * 1.通过lookup函数找到Alice和Bob出现的下标位置,保存在nn和mm中
	 * 2.fanwei这个数组用于存放句子中每一个Alice的作用范围,比如:有一个Alice的起始坐标为20,k为10,那么我们可以求得
	 * 它的有效范围是[subscript-k-3,subscript+5+k]=[7,35],因此fanwei[7]++,fanwei[36]--;(从7处生效,36处失效)
	 * 3.定义数组shouyi,这个数组用来标记每一个位置处于多少个Alice的作用范围。


* 4.最后,遍历mm,累加每一个Bob起始下标的收益即可。


* */ public class 人物相关性分析 { public static ArrayList lookup(String keywords,String sentence) { int index=0; int keylen=keywords.length(); int len=sentence.length(); char[] sen=sentence.toCharArray(); ArrayList nn = new ArrayList(); int i=1; while(true) { int subscript=sentence.indexOf(keywords,index); if(subscript==-1) { break; } char s1=sen[subscript+keylen]; char s2=sen[subscript-1]; if(check(s1)&&check(s2)) { nn.add(subscript-1); i++; } index=subscript+keylen; } return nn; } private static boolean check(char ch) { if((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')) return false; return true; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int k=in.nextInt(); in.nextLine(); String sentence=in.nextLine(); int len=sentence.length(); String n="Alice"; String m="Bob"; ArrayList nn=lookup(n," "+sentence+" "); ArrayList mm=lookup(m," "+sentence+" "); int[] fanwei=new int[len]; for(int i=0;i

I.等差数列

数学老师给小明出了一道等差数列求和的题目。


但是粗心的小明忘记了一部分的数列,只记得其中N个整数。



现在给出这N个整数,小明想知道包含这N个整数的最短的等差数列有几项?
【输入格式】
输入的第一行包含一个整数N。



第二行包含N个整数A1,A2,… ,Aw。


(注意A~~A、并不一定是按等差数列中的顺序给出)
 

参考代码  
package lanqiaobei_10;


	import java.util.*;

	public class 等差数列1 {
	    public static void main(String[] args) {
	        Scanner sc=new Scanner(System.in);
	        int n=sc.nextInt();
	        int[] a=new int[n];
	        for(int i=0;i
J.扫地机器人

小明公司的办公区有一条长长的走廊,由N个方格区域组成,如下图所示。



 

 

走廊内部署了K台扫地机器人,其中第i台在第A;个方格区域中。


已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净。



请你编写一个程序,计算每台机器人的清扫路线,使得
1.它们最终都返回出发方格,
2.每个方格区域都至少被清扫一遍,
3.从机器人开始行动到最后一台机器人归位花费的时间最少。



注意多台机器人可以同时清扫同一方块区域,它们不会互相影响。


输出最少花费的时间。



在上图所示的例子中,最少花费时间是6。


第一台路线: 2-1-2-3-4-3-2,清扫了1、2、3、4号区域。


第二台路线5-6-7-6-5,清扫了5、6、7。


第三台路线10-9-8-9-10,清扫了8、9和 10。



 

参考代码  
package lanqiaobei_10;

import java.util.Scanner;
import java.util.Arrays;
//递归
public class 扫地robot {
	
   static int arr[];//局部变量arr[] 转变   为   arr
   
   static int n;//局部变量变为全局变量

	public static void main(String[] args) {
		@SuppressWarnings("resource")
		Scanner scanner = new Scanner(System.in);
		 n = scanner.nextInt();//有n个格子
		int k = scanner.nextInt();//一共有k个机器人
		//存放数组   k  3个机器人
		arr = new int[k];//存放机器人的位置
		//循环k
		for (int i = 0; i < k; i++) {
			arr[i]=scanner.nextInt();		
			}
		Arrays.sort(arr);//排序  符合 题目输入    5  2  10     不是   2  5  10
		
		dfs(1, arr[0] - 1,0);
		System.out.println(min*2);
	}
	
	static int min = 100000;//题目要求范围   最小值求的是走过的格子数     如:2号位置的机器人左边来回2个格子 2分钟
	//定义一个方法叫  dfs
	//可以分2种情况   机器人是否在最后的位置
	//k代表第几个机器人
	 // 2  (第一个机器人)        5(第2个机器人)     10(第三个机器人)
	
	public static void dfs(int k,int before,int max) {//before 为步数
		if (k == arr.length) {
			//这个机器人能走多少步?
			//temp为左边步数
			
		int temp =	before + n - arr[arr.length - 1];
		max = Math.max(max, temp);//max 为当前这种走法   所有机器人走的最多的一个机器人的步数
		min = Math.min(min, max);//求的是  所有走法的最大值    取一个最短的时间
		
		}else {//不是最后一个机器人能走多少步?
			
		//	第2个机器人的位置减去第一个机器人的位置 再减1
			for (int i = 0; i < arr[k] - arr[k - 1] - 1; i++) {//i  代表往后走i步   最多只能走   后一个机器人  减前一个机器人的位置 再减1
				int temp =before +i;    //第 k个机器人走的步数
				
				dfs(k+1, arr[k] - arr[k - 1] - 1-i,Math.max(max, temp));// 第k+1个机器人    前面还剩余 arr[k] - arr[k - 1] - 1-i  的步数没走
			}//max  代表k个机器人之前所以机器人走的最大步数
			
		}
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/562652.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-02
下一篇2022-04-02

发表评论

登录后才能评论

评论列表(0条)