第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第1张图片

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第2张图片

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第3张图片

分析:

方法一:手算,五个五个写,慢点写

方法二:上机写代码

代码:

import java.util.Scanner;
public class Main{ 
	public static void main(String[] args) {
		String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY"; // 加密后的字符
		String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 原字符
		String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV"; // 加密后的字符
		for(int i=0;i<str.length();i++){
			System.out.print(s1.charAt(s2.indexOf(str.charAt(i))));
		}		
	}
}

答案:

YeRikGSunlRzgDlvRwYkXkrGWWhXaA

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第4张图片

分析:

方法一:计算器

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第5张图片

36138 * 24 * 60

方法二:日期类

方法三:常规方法,判断是否是闰年再计算天数

代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) throws ParseException {
		SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date1=sf.parse("1921-7-23 12:0:0");
		Date date2 = sf.parse("2020-7-1 12:0:0");
		System.out.print((date2.getTime()-date1.getTime())/1000/60);
	}
}
import java.util.Date;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Date date1 = new Date(21, 6, 23, 12, 0, 0); // 1921  年:是减去1900得到的数    月:0-11     日:1-31
		Date date2 = new Date(120, 6, 1, 12, 0, 0); // 2020
		long time=date2.getTime()-date1.getTime();
		System.out.print((time/1000)/60);

	}
}

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		int day=0,i;
		for(i=1922;i<=2019;i++){
			if((i%400)==0||(i%4==0&&i%100!=0)){
				day+=366;
			}else{
				day+=365;
			}
		}
		day+=31-23+31+30+31+30+31; //1921年7月24日0点开始
		i=2020;
		if((i%400)==0||(i%4==0&&i%100!=0)){  //2020年7月1日24点结束
			day+=31+29+31+30+31+30+1;
		}else{
			day+=31+28+31+30+31+30+1;
		}
		System.out.print(day*24*60);
	}
}

答案:

52038720

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第6张图片

分析:

设A国被测总人数n人,k人为一组,需要n/k个试剂盒子

感染人数0.01*n人,以最坏的情况分配试剂盒子,最多有0.01nk个试剂盒子需要重新检测

此时,总共需要检测n/k+0.01nk个试剂盒子

设y=n/k+0.01nk,n为定值,求k为多少时,y最小?

y=n(n/k+k/100) k=10时,y最小

代码:

答案:

10

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第7张图片

分析:

方法一:01背包思想,求出当背包重量最大为sum/2时最大能装多少个口罩,然后乘以2,用sum减去就可以了。

方法二:深度优先搜索思想(速度时间复杂度比上面方法一更快一点),搜索所有情况。

代码:

01背包思想

import java.util.Scanner;
public class Main {	
	public static void main(String arg[]){
		Scanner sc=new Scanner(System.in);
		int[] dp=new int[49945000];
		int[] nums = { 0, 9090400, 8499400, 5926800, 8547000, 4958200, 4422600,
				5751200, 4175600, 6309600, 5865200, 6604400, 4635000, 10663400, 8087200, 4554000 };
		int sum=0;
		for(int i:nums){
			sum+=i;
		}
		int avg=sum/2;
		for(int i=1;i<nums.length;i++){
			for(int j=avg;j>=1;j--){
				if(nums[i]<=j){
					dp[j]=Math.max(dp[j], dp[j-nums[i]]+nums[i]);
				}
			}
		}
		System.out.print((avg-dp[avg])*2);
	}
}

深搜dfs

import java.util.Scanner;
public class Main {	
	static int ans=Integer.MAX_VALUE;
	static int[] num={ 9090400, 8499400, 5926800, 8547000, 4958200, 4422600,
			5751200, 4175600, 6309600, 5865200, 6604400, 4635000, 10663400, 8087200, 4554000 };
	public static void main(String arg[]){
		dfs(0,0,0);
		System.out.print(ans);
	}
	public static void dfs(int k,int sum1,int sum2){
		if(k==15){
			if(Math.abs(sum1-sum2)<ans){
				ans=Math.abs(sum1-sum2);
			}
			return;
		}
		dfs(k+1,sum1+num[k],sum2);
		dfs(k+1,sum1,sum2+num[k]);
	}
}

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第8张图片

分析:

BigInteger简直牛逼!就是费内存!

利用BigInteger里的a.gcd(b)方法求a和b的最大公约数

Scanner scanner = new Scanner(System.in);
BigInteger x = scanner.nextBigInteger();//可以接收int类型
BigInteger y = scanner.nextBigInteger();//也可以利用BigInteger.valueOf()将其他类型转换为BigInteger类型

BigInteger gcd = x.gcd(y);	//BigInteger自带的求最大公约数的方法

//BigInteger.valueOf()使用演示
int a = 10;
BigInteger b = BigInteger.valueOf(a);	

代码:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		BigInteger arr[] = new BigInteger[2025]; // int long型数据均会爆数组
		arr[0] = BigInteger.ZERO;
		arr[1] = arr[2] = BigInteger.ONE;
		for (int i = 3; i <= 2020; i++) {
			arr[i] = arr[i - 1].add(arr[i - 2]);   //BigInteger的加减乘除 与或非 等于 都有 .****   可以自己才eclipse查看(直接. 就会出现很多方法)
		}
		for (int i = 1; i <= 7; i++) { // 输出斐波那契数组的元素值 验证
			System.out.println(i + ": " + arr[i]);
		}
		System.out.println(arr[520]);
		System.out.println(arr[2020]);
		System.out.println(arr[2020].mod(arr[520]));
		System.out.println(arr[2020].gcd(arr[520]));
//		System.out.println(gcd(arr[2020],arr[520]));
	}
 
//	public static BigInteger gcd(BigInteger a, BigInteger b) {
//		return b.equals(BigInteger.ZERO) ? a : gcd(b, a.mod(b));
//	//	if (b.compareTo(BigInteger.ZERO) == 0) {
//	//		return a;
//	//	}
//	//	return gcd(b, a.mod(b));
//	}
}

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第9张图片

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第10张图片

分析:

大写字母、小写字母、数字、其他

代码:

import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
    	Scanner sc=new Scanner(System.in);
		String str=sc.next();
		int dx=0,xx=0,sz=0;
		for(int i=0;i<str.length();i++){
			if(str.charAt(i)>='A'&&str.charAt(i)<='Z'){
				dx++;
			}else if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
				xx++;
			}else if(str.charAt(i)>='0'&&str.charAt(i)<='9'){
				sz++;
			}
		}
		System.out.println(dx);
		System.out.println(xx);
		System.out.println(sz);
    }
}

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第11张图片

分析:

方法一

举例:

(2+5+7+9)%3=2

转换》》

2%3=2, 5%3=2, 7%3=1, 9%3=0

2+2+1+0=5%3=2

都能得到2,但是,万一2+2+1+0加起来的数超过了long所能存储的范围了呢? 行不通,继续转换

转换》》

2%3=2, 5%3=2, 7%3=1, 9%3=0

(2+2)%3=1 (1+1)%3=2 (2+0)%3=2

行了!这不都保证小于3了嘛!

利用好取模公式:ab mod c=((a mod c)(b mod c)) mod c

加法也一样,每两两取模

注意事项:
double的范围大。强转有损失

方法二

biginteger yyds

多大的数都能接受,可以不用上面的相加时取余和单个数取余。

代码:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
    	Scanner sc=new Scanner(System.in);
    	int n=sc.nextInt();
    	long sum=0L;
    	for(int i=1;i<=n;i++){
    		long s1=i*1L;
    		//long s2=s1;
    		for(int j=1;j<=3;j++){
    			s1=(s1*s1)%123456789L;  	 //两两相乘取模		
    			//s2=(long)Math.pow(s2,2)%123456789;   //double的范围大。强转有损失
    		}
    		//sum+=(long)Math.pow((long)Math.pow((long)Math.pow(i,2)%123456789L,2)%123456789L,2)%123456789L;
    		sum+=s1;
    		sum%=123456789L;
    	}
    	System.out.print(sum);
    }
}
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		BigInteger sum=BigInteger.ZERO;
		for(int i=1;i<=n;i++){
			BigInteger s=BigInteger.valueOf(i);
			s=s.pow(8);
			s=s.mod(BigInteger.valueOf(123456789));
			sum=sum.add(s);
			sum=sum.mod(BigInteger.valueOf(123456789));
		}
		System.out.print(sum);
	}
}
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		BigInteger sum=BigInteger.ZERO;
		for(int i=1;i<=n;i++){
			BigInteger s=BigInteger.valueOf(i);
			s=s.pow(8);
			sum=sum.add(s);
		}
		sum=sum.mod(BigInteger.valueOf(123456789));
		System.out.print(sum);
	}
}

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第12张图片

分析:

字典序要最大

如果i为1 、2并且与下一个字符加起来的数字小于26,两个数字组成一个字母

如果i > = 3 ,或者 大于26 ,一个数字组成一个字母

代码:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
    	Scanner sc=new Scanner(System.in);
		String str=sc.next();
		StringBuilder s=new StringBuilder();
		for(int i=0;i<str.length();){
			int n=str.charAt(i)-'0';
			if(n<3&&i<str.length()-1){
				int num=n*10+str.charAt(i+1)-'0';
				if(num<=26){
					s.append(Character.toString((char)(num+64)));
					i+=2;
				}else{
					s.append(Character.toString((char)(n+64)));
					i++;
				}
			}else{
				s.append(Character.toString((char)(n+64)));
				i++;
			}
		}
		System.out.print(s);
    }
}

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第13张图片

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第14张图片

分析:

代码:

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第15张图片

第十一届蓝桥杯大赛软件类省赛Java大学B组(第一场)_第16张图片

分析:

代码:

你可能感兴趣的:(刷题,java,蓝桥杯,算法)