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

    xiaoxiao2022-07-07  183

    第一题:三角形面积

    已知三角形三个顶点在直角坐标系下的坐标分别为: (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个很有趣的性质:

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

    以下是{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]); } }

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

    最新回复(0)