2018年第九届蓝桥杯A组java试题及题解

第一题:三角形面积

已知三角形三个顶点在直角坐标系下的坐标分别为:
(2.3, 2.5)
(6.4, 3.1)
(5.1, 7.2)

求该三角形的面积。

注意,要提交的是一个小数形式表示的浮点数。
要求精确到小数后3位,如不足3位,需要补零。


第二题:阅兵方阵

x国要参加同盟阅兵活动。
主办方要求每个加盟国派出的士兵恰好能组成 2 个方阵。
x国发现弱小的 y国派出了130人的队伍,他们的士兵在行进中可以变换2种队形:
130 = 81 + 49 = 9^2 + 7^2
130 = 121 + 9 = 11^2 + 3^2

x国君很受刺激,觉得x国面积是y国的6倍,理应变出更多队形。
于是他发号施令:
我们要派出一支队伍,在行进中要变出 12 种队形!!!

手下人可惨了,要忙着计算至少多少人才能组成 12 种不同的双方阵。
请你利用计算机的优势来计算一下,至少需要多少士兵。

(ps: 不要失去信心,1105人就能组成4种队形了)

注意,需要提交的是一个整数,表示至少需要士兵数目,不要填写任何多余的内容

题解:

 import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.*;

public class Main {
	
	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		int cnt = 0;
		boolean flag=false;
		int n=1000;
		while(true){
			cnt=0;
			for(int j=1;j*j<=n/2;j++){
				int a = j*j;
				int b = n-a;
				if(Math.sqrt(b)==(int)(Math.sqrt(b))){
					cnt++;
				}
			}
			if(cnt==12)
				break;
			n++;
		}
		System.out.println(n);
	}
}

答案:160225


第三题:找假币

在8枚硬币中,有1枚假币,假币外观与真币一模一样,只是重量略轻或略重一点。
给你一架天平,要求最多称3次,就找出假币,并且知道它是重一些还是轻一些。
下面的代码给出一个解决方案,仔细分析逻辑,填写划线位置缺少的代码。

import java.util.*;
public class Main
{
	static int balance(int a, int b){
		if(a<b) return -1;
		if(a>b) return 1;
		return 0;
	}
	
	static void judge(char[] data, int a, int b, int std){
		switch(balance(data[a],data[std])){
		case -1:
			System.out.println(a + " light");
			break;
		case 0:
			System.out.println(b + " heavy");
			break;
		case 1:
			System.out.println("err!");
		}
	}
	
	// data 中8个元素,有一个假币,或轻或重
	static void f(char[] data){
		switch( __________________________________________________ ){  //填空
		case -1:
			switch(balance(data[0]+data[4],data[3]+data[1])){
				case -1:
					judge(data,0,3,1);
					break;
				case 0:
					judge(data,2,5,0);
					break;
				case 1:
					judge(data,1,4,0);
			}
			break;
		case 0:
			judge(data,6,7,0);		
			break;
		case 1:
			switch(balance(data[0]+data[4],data[3]+data[1])){
				case -1:
					judge(data,4,1,0);
					break;
				case 0:
					judge(data,5,2,0);
					break;
				case 1:
					judge(data,3,0,1);
			}
			break;		
		}	
	}
	
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		
		int n = scan.nextInt();
		scan.nextLine();
		
		for(int i=0; i<n; i++){
			f(scan.nextLine().trim().toCharArray());
		}
	}
}

答案:balance(data[0]+data[1]+data[2],data[3]+data[4]+data[5])


第四题:版本分支

小明负责维护公司一个奇怪的项目。这个项目的代码一直在不断分支(branch)但是从未发生过合并(merge)。
现在这个项目的代码一共有N个版本,编号1~N,其中1号版本是最初的版本。
除了1号版本之外,其他版本的代码都恰好有一个直接的父版本;即这N个版本形成了一棵以1为根的树形结构。

如下图就是一个可能的版本树:

1
/ \
2 3
| / \
5 4 6

现在小明需要经常检查版本x是不是版本y的祖先版本。你能帮助小明吗?

输入

第一行包含两个整数N和Q,代表版本总数和查询总数。
以下N-1行,每行包含2个整数u和v,代表版本u是版本v的直接父版本。
再之后Q行,每行包含2个整数x和y,代表询问版本x是不是版本y的祖先版本。

对于30%的数据,1 <= N <= 1000 1 <= Q <= 1000
对于100%的数据,1 <= N <= 100000 1 <= Q <= 100000

输出

对于每个询问,输出YES或NO代表x是否是y的祖先。

【样例输入】
6 5
1 2
1 3
2 5
3 6
3 4
1 1
1 4
2 6
5 2
6 4

【样例输出】
YES
YES
NO
NO
NO

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

题解:

import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.*;

public class Main {
	
	static int[] pre ;
	
	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		pre = new int[n+1];
		for(int i=0;i<=n;i++)
			pre[i] = i;
		int u,v;
		for(int i=0;i<n-1;i++){
			u = sc.nextInt();
			v = sc.nextInt();
			pre[v] = u;
		}
//		for(int i=1;i<=n;i++)
//			System.out.print(pre[i]+" ");
		for(int i=0;i<q;i++){
			u = sc.nextInt();
			v = sc.nextInt();
			if(find(u,v))
				System.out.println("Yes");
			else
				System.out.println("No");
		}
	}

	private static boolean find(int u, int v) {
		int tp;
		while(true){
			tp = pre[v];
			if(tp==u)
				return true;
			if(tp==1)
				return false;
			v = tp;
		}
	}
}

第五题:自描述序列

小明在研究一个序列,叫Golomb自描述序列,不妨将其记作{G(n)}。这个序列有2个很有趣的性质:

  1. 对于任意正整数n,n在整个序列中恰好出现G(n)次。
  2. 这个序列是不下降的。

以下是{G(n)}的前几项:

n 1 2 3 4 5 6 7 8 9 10 11 12 13
G(n) 1 2 2 3 3 4 4 4 5 5 5 6 6

给定一个整数n,你能帮小明算出G(n)的值吗?

输入

一个整数n。

对于30%的数据,1 <= n <= 1000000
对于70%的数据,1 <= n <= 1000000000
对于100%的数据,1 <= n <= 2000000000000000

输出

一个整数G(n)

【样例输入】
13

【样例输出】
6

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
题解:(30%)

import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.*;

public class Main {
	
	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] s = new int[100010];
		s[1]=1;
		s[2]=2;
		int t=2;
		boolean flag = false;
		for(int i=2;t<=n;i++){
			for(int j=0;j<=s[i]-1;j++){
				s[t++]=i;
				if(t>n){
					flag = true;
					break;
				}
			}
			if(flag) break;	
		}
		System.out.println(s[n]);
	}
}

第六题,不想写,写了也不会,难受

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值