第十五届蓝桥杯javab组个人题解

个人题目理解不一定对,仅供参考,各位大佬勿喷

第一题

​​​​在这里插入图片描述

2429042904288

考场上暴力找规律,最后发现第n个被报出的数就是n×12,于是:202420242024L×12得出答案。

第二题

在这里插入图片描述
暴力模拟

7913837

package 第十五届省赛;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class 类斐波拉契数列 {
	static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
	static StreamTokenizer st1=new StreamTokenizer(bf);
	static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
	static int N=(int) 1e7;
	static int a[]=new int[N];
	
	public static void main(String[] args) throws IOException {
		for(int i=N;i>=0;i--) {
			if(check(i)) {
				System.out.println(i);
				break;
			}
		}
	}
	private static boolean check(int num) {
		String s=num+"";
		int i=0;
		for(i=1;i<=s.length();i++) {
			a[i]=s.charAt(i-1)-'0';
		}
		int len=s.length();
		
		while(a[i-1]<num) {	//i==4
			int sum=0;
			for(int j=i-len;j<i;j++) {	//1-3
				sum+=a[j];
			}
			a[i]=sum;	
			i++;
		}
		if(a[i-1]==num) return true;
		return false;
	}
	static int I() throws IOException {
		st1.nextToken();
		return (int)st1.nval;
	}
}

第三题

在这里插入图片描述在这里插入图片描述在这里插入图片描述

一道简单模拟,因为不要求输出元素值,所以就没必要把值给存下来了
在这里插入图片描述

package 第十五届省赛; 
import java.util.Scanner;

public class 分布式队列 {
	static Scanner sc=new Scanner(System.in);
	static int N=20;
	static int n,cnt; 
	static int count[]=new int[N];//每一个子节点含有的元素个数
	public static void main(String[] args) {
		n=sc.nextInt();
		sc.nextLine(); //这里要吸收掉缓冲区留下的回车
		while(sc.hasNext()) {//题目只说包含多行输入,我只想到用这个来阻塞输入了
			String s[]=sc.nextLine().split(" ");
			if("add".equals(s[0])) {
				cnt++;		//直接存主节点个数就行了
			}
			else if("sync".equals(s[0])){
				int idx=Int(s[1]);
				int c=count[idx];
				if(c<cnt) count[idx]++;	//这里得预防题目先让你sync再add的情况
			}
			else {
				int min=cnt;
				if(cnt==0) System.out.println(0); //主节点为0,那子节点肯定就是0
				else {
					for(int i=1;i<=n-1;i++) {	//主节点也算在n里面,所以子节点个数为n-1
						if(count[i]<min) {
							min=count[i];
						}
					}
					System.out.println(min);
				}
			}
		}
	}
	
	static int Int(String s) {
		return Integer.parseInt(s);
	}
}

第四题

在这里插入图片描述
在这里插入图片描述
看着像多重背包,套模板了,但是c网上只过了两个样例

package 第十五届省赛;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class 食堂 {	//多重背包 复杂度:3*600*8*100=1440000 1e7
	static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
	static StreamTokenizer st1=new StreamTokenizer(bf);
	static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
	static int N=110;
	static int dp[]=new int[N];
	static int a[]=new int[N];//存储寝室个数
	static int b4,b6,m;
	static int q;				
	public static void main(String[] args) throws IOException {//19:05-19:33
		q=I();
	
		while(q--!=0) {
			for(int i=2;i<=4;i++) {
				a[i]=I();
			}
			b4=I();
			b6=I();
			m=4*b4+6*b6;
			for(int i=2;i<=4;i++) { 
				for(int j=m;j>=i;j--) {
					for(int k=0;k<=a[i]&&k*i<=j;k++) {
						dp[j]=Math.max(dp[j], dp[j-k*i]+k*i);
					}
				}
			}
			System.out.println(dp[m]);
		}
	}
	
	static int I() throws IOException {
		st1.nextToken();
		return (int)st1.nval;
	}
}

第五题

在这里插入图片描述
在这里插入图片描述
看着像是一道高中数学题?而且还是c++第11届的《合并检测》缝补而来。不过有点不一样,这题要求平均分成若干组,不能有剩。
在这里插入图片描述
在这里插入图片描述

package 第十五届省赛;
import java.util.Scanner;

public class 最优分组 {
	static Scanner sc=new Scanner(System.in);
	static int N=(int) (1e6+10);	
	static int n;				
	static int ans=1;	//必须初始化为1,不然可能
	public static void main(String[] args){
		int n=sc.nextInt();
		double p=sc.nextDouble();
		double min=n;
		for(int k=1;k<=n;k++) {
			if(n%k==0) {
				double pt=Math.pow((1-p), k);//每一组内没有一人感染的概率
				double num=(1-pt)*n+n/k; //需要使用的总试剂数
				if(min>num) {
					min=num;
					ans=k;
				}
			}
		}
		System.out.println(ans);
	}
}

第六题

在这里插入图片描述
在这里插入图片描述
考前一直在复习单源最短路径,并且看到了n<=1000,考场上想的是floyd会不会超时,所以就背了dijkstra的堆优化版本来写这题,但是由于代码背错了,最后10min才改成了floyd代码交了。
——————————————————————————————
考完后仔细算了一下复杂度,发现这道题有q次询问,如果用dijkstra的话,每次询问都要执行一遍,即使是堆优化版的dijkstra,手算了一下复杂度,也得到达10的9次方级别。。。比floyd还要高一些(常数要大一些)。

下面是floyd版代码:
——————————————————————————————
我感觉floyd是正解,但不知道为什么,在c网交了之后,只能过1个样例。。。

package 第十五届省赛;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class 星际旅行 {
	static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
	static StreamTokenizer st1=new StreamTokenizer(bf);
	static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
	static int N=(int) (1e3+10),M=2*N,INF=0x3f3f3f3f;	
	static int n,m,q,count,ans;
	static int dp[][]=new int[N][N];
	public static void main(String[] args) throws IOException {
		n=I();
		m=I();
		q=I();
		for(int i=1;i<=n;i++) {
			for(int j=1;j<=n;j++) {
				if(i==j) dp[i][j]=0;
				else {
					dp[i][j]=INF;
				}
			}
		}
		
		for(int i=1;i<=m;i++) {
			int a=I();
			int b=I();
			dp[a][b]=1;
			dp[b][a]=1;
		}
		floyd();
		
		int t=q;
		while(t--!=0) {
			int s=I();
			int cnt=I();
			for(int i=1;i<=n;i++) {
				if(dp[s][i]<=cnt) {
					count++;
				}
			}
		}
		System.out.printf("%.2f",1.0*Math.round(count/q));
	}

	private static void floyd() {
		for(int k=1;k<=n;k++) {
			for(int i=1;i<=n;i++) {
				for(int j=1;j<=n;j++) {
					dp[i][j]=Math.min(dp[i][j], dp[i][k]+dp[k][j]);
				}
			}
		}	
	}
	
	static int I() throws IOException {
		st1.nextToken();
		return (int)st1.nval;
	}
}

————————————————————————————————
G题和H题还没写,后面想补题的时候再更新吧。。。

第七题

在这里插入图片描述
在这里插入图片描述

第八题

在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值