日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

第六届省赛(软件类)真题----Java大学B组答案及解析

發(fā)布時間:2025/3/15 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六届省赛(软件类)真题----Java大学B组答案及解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第六屆省賽(軟件類)真題----Java大學B組答案及解析

  • 三角形面積
  • 立方變自身
  • 三羊獻瑞
  • 循環(huán)節(jié)長度
  • 九數(shù)組分數(shù)
  • 加法變乘法
  • 牌型種數(shù)
  • 飲料換購
  • 壘骰子
  • 生命之樹
  • 一、三角形面積


    如【圖1】所示。圖中的所有小方格面積都是1。
    那么,圖中的三角形面積應該是多少呢?


    請?zhí)顚懭切蔚拿娣e。不要填寫任何多余內(nèi)容或說明性文字。

    答案:28

    二、立方變自身


    觀察下面的現(xiàn)象,某個數(shù)字的立方,按位累加仍然等于自身。
    1^3 = 1?
    8^3? = 512? ? 5+1+2=8
    17^3 = 4913? ?4+9+1+3=17
    ...
    請你計算包括1,8,17在內(nèi),符合這個性質(zhì)的正整數(shù)一共有多少個?
    請?zhí)顚懺摂?shù)字,不要填寫任何多余的內(nèi)容或說明性的文字。
    答案:6
    解析:稍微運行一會,出不來就手動停止即可
    public class Main2 {public static void main(String[] args) {for (int i = 1; ; i++) {int sum = 0;int p = (int) Math.pow(i,3);while (p != 0) {sum += p%10;p/=10;}if (sum == i) {System.out.println(i);}}} }

    三、三羊獻瑞

    觀察下面的加法算式:
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    其中,相同的漢字代表相同的數(shù)字,不同的漢字代表不同的數(shù)字。
    請你填寫“三羊獻瑞”所代表的4位數(shù)字(答案唯一),不要填寫任何多余內(nèi)容。
    答案:1085
    解析:暴力枚舉就可以,不要忘記每個漢字代表不同數(shù)字,一開始忘記每次將set清零了,導致運行不出來
    import java.util.HashSet; import java.util.Set;public class Main2 {public static void main(String[] args) {int a;//祥int b;//瑞int c;//生int d;//輝int e;//三int f;//羊int g;//獻int h;//氣Set<Integer> set = new HashSet<>();for (a = 1; a <= 9; a++) {for ( b = 0; b <= 9; b++) {for ( c = 0; c <= 9; c++) {for ( d = 0; d <= 9; d++) {for ( e = 1; e <= 9; e++) {for ( f = 0; f <= 9; f++) {for ( g = 0; g <= 9; g++) {for ( h = 0; h <= 9; h++) {set.clear();set.add(a);set.add(b);set.add(c);set.add(d);set.add(e);set.add(f);set.add(g);set.add(h);int w = a*1000+b*100+c*10+d;int q = e*1000+f*100+g*10+b;int z = e*10000+f*1000+c*100+b*10+h;if(w+q == z && set.size() == 8) {System.out.println(q);}}}}}}}}}} }

    四、循環(huán)節(jié)長度

    兩個整數(shù)做除法,有時會產(chǎn)生循環(huán)小數(shù),其循環(huán)部分稱為:循環(huán)節(jié)。
    比如,11/13=6=>0.846153846153.....? 其循環(huán)節(jié)為[846153] 共有6位。
    下面的方法,可以求出循環(huán)節(jié)的長度。
    請仔細閱讀代碼,并填寫劃線部分缺少的代碼。

    public static int f(int n, int m){n = n % m; Vector v = new Vector();for(;;){?v.add(n);?n *= 10;?n = n % m;?if(n==0) return 0;?if(v.indexOf(n)>=0) _________________________________ ; //填空 ?} }注意,只能填寫缺少的部分,不要重復抄寫已有代碼。不要填寫任何多余的文字。

    答案:v.size()-v.indexOf(n)

    五、九數(shù)組分數(shù)

    1,2,3...9 這九個數(shù)字組成一個分數(shù),其值恰好為1/3,如何組法?
    下面的程序實現(xiàn)了該功能,請?zhí)顚憚澗€部分缺失的代碼。

    public class A {public static void test(int[] x){int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8]; if(a*3==b) System.out.println(a + " " + b);}public static void f(int[] x, int k){if(k>=x.length){test(x);return;}for(int i=k; i<x.length; i++){{int t=x[k]; x[k]=x[i]; x[i]=t;}f(x,k+1);_______________________________________ // 填空}}public static void main(String[] args){int[] x = {1,2,3,4,5,6,7,8,9}; f(x,0);} }注意,只能填寫缺少的部分,不要重復抄寫已有代碼。不要填寫任何多余的文字。
    答案:{int t=x[k]; x[k]=x[i]; x[i]=t;}
    解析:dfs 回溯

    六、加法變乘法

    我們都知道:1+2+3+ ... + 49 = 1225
    現(xiàn)在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015
    比如:
    1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
    就是符合要求的答案。
    請你尋找另外一個可能的答案,并把位置靠前的那個乘號左邊的數(shù)字提交(對于示例,就是提交10)。
    注意:需要你提交的是一個整數(shù),不要填寫任何多余的內(nèi)容。

    答案:16
    public class Main {public static void main(String[] args) {for (int i = 1; i < 49; i++) {for (int j = 1; j < 49; j++) {if (i*(i+1) + j*(j+1) -(2*i+2*j+2)== 2015-1225) {System.out.println(i);}}}} }

    七、牌型種數(shù)

    小明被劫持到X賭城,被迫與其他3人玩牌。
    一副撲克牌(去掉大小王牌,共52張),均勻發(fā)給4個人,每個人13張。
    這時,小明腦子里突然冒出一個問題:
    如果不考慮花色,只考慮點數(shù),也不考慮自己得到的牌的先后順序,自己手里能拿到的初始牌型組合一共有多少種呢?
    請?zhí)顚懺撜麛?shù),不要填寫任何多余的內(nèi)容或說明文字。

    答案:3598180
    public class Main {static int sum;static int ans;public static void main(String[] args) {dfs(1);System.out.println(ans);}public static void dfs(int n) {if (sum > 13) {return;}if ( n > 13) {if (sum == 13) {ans++;return;}} else {for (int i = 0; i < 5; i++) {sum += i;dfs(n+1);sum -= i;}}} }

    八、壘骰子


    賭圣atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
    經(jīng)過長期觀察,atm 發(fā)現(xiàn)了穩(wěn)定骰子的奧秘:有些數(shù)字的面貼著會互相排斥!
    我們先來規(guī)范一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
    假設有 m 組互斥現(xiàn)象,每組中的那兩個數(shù)字的面緊貼在一起,骰子就不能穩(wěn)定的壘起來。 atm想計算一下有多少種不同的可能的壘骰子方式。
    兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數(shù)字的朝向都相同。
    由于方案數(shù)可能過多,請輸出模 10^9 + 7 的結果。
    不要小看了 atm 的骰子數(shù)量哦~
    「輸入格式」
    第一行兩個整數(shù) n m
    n表示骰子數(shù)目
    接下來 m 行,每行兩個整數(shù) a b ,表示 a 和 b 不能緊貼在一起。
    「輸出格式」
    一行一個數(shù),表示答案模 10^9 + 7 的結果。
    「樣例輸入」
    2 1
    1 2

    「樣例輸出」
    544

    「數(shù)據(jù)范圍」
    對于 30% 的數(shù)據(jù):n <= 5
    對于 60% 的數(shù)據(jù):n <= 100
    對于 100% 的數(shù)據(jù):0 < n <= 10^9, m <= 36

    資源約定:
    峰值內(nèi)存消耗(含虛擬機) < 256M
    CPU消耗? < 2000ms

    請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
    所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
    注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
    注意:主類的名字必須是:Main,否則按無效代碼處理。

    解析:題目難點在于想到使用矩陣存放數(shù)據(jù),想到這種方法之后還要懂得如何求矩陣快速冪,不然肯定是會超時的。

    關于矩陣快速冪可以參考下面的文章斐波那契數(shù)列(二)--矩陣優(yōu)化算法

    import java.util.Scanner;public class Main2 {static final double MOD = 10e9-7;static int[][] arr = new int[6][6];public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();int m = input.nextInt();/*** 初始化arr數(shù)組* */for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {arr[i][j] = 1;}}for (int i = 0; i < m; i++) {int a = input.nextInt();int b = input.nextInt();arr[a-1][b-1] = 0;arr[b-1][a-1] = 0;}/**** */int[][] ans = pow(arr, n-1);int sum = 0;for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {sum += ans[i][j]%MOD;}}/*** 旋轉情況 4^n* */sum *= Math.pow(4, n)%MOD;System.out.println((int)(sum%MOD));}private static int[][] pow(int[][] arr, int k) {/*** 單位矩陣* */int[][] ans = new int[6][6];for (int i = 0; i < 6; i++) {ans[i][i] = 1;}/*** 矩陣快速冪核心算法* */while (k != 0) {if (k % 2 != 0) {ans = Multiply(arr, ans);}/*** 每次算多加一顆骰子,這樣算比單純n次相乘要快* */arr = Multiply(arr, arr);k >>= 1;}return ans;}private static int[][] Multiply(int[][] m, int[][] n) { // 標準計算矩陣乘法算法int rows = m.length;int cols = n[0].length;int[][] r = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {for (int k = 0; k < m[i].length; k++) {r[i][j] += (m[i][k] * n[k][j])%MOD;}}}return r;} }

    十、生命之樹


    在X森林里,上帝創(chuàng)建了生命之樹。
    他給每棵樹的每個節(jié)點(葉子也稱為一個節(jié)點)上,都標了一個整數(shù),代表這個點的和諧值。
    上帝要在這棵樹內(nèi)選出一個非空節(jié)點集S,使得對于S中的任意兩個點a,b,都存在一個點列 {a, v1, v2, ..., vk, b} 使得這個點列中的每個點都是S里面的元素,且序列中相鄰兩個點間有一條邊相連。
    在這個前提下,上帝要使得S中的點所對應的整數(shù)的和盡量大。
    這個最大的和就是上帝給生命之樹的評分。
    經(jīng)過atm的努力,他已經(jīng)知道了上帝給每棵樹上每個節(jié)點上的整數(shù)。但是由于 atm 不擅長計算,他不知道怎樣有效的求評分。他需要你為他寫一個程序來計算一棵樹的分數(shù)。

    「輸入格式]
    第一行一個整數(shù) n 表示這棵樹有 n 個節(jié)點。
    第二行 n 個整數(shù),依次表示每個節(jié)點的評分。
    接下來 n-1 行,每行 2 個整數(shù) u, v,表示存在一條 u 到 v 的邊。由于這是一棵樹,所以是不存在環(huán)的。
    「輸出格式」
    輸出一行一個數(shù),表示上帝給這棵樹的分數(shù)。

    「樣例輸入」
    5
    1 -2 -3 4 5
    4 2
    3 1
    1 2
    2 5

    「樣例輸出」
    8

    「數(shù)據(jù)范圍」
    對于 30% 的數(shù)據(jù),n <= 10
    對于 100% 的數(shù)據(jù),0 < n <= 10^5, 每個節(jié)點的評分的絕對值不超過 10^6 。

    資源約定:
    峰值內(nèi)存消耗(含虛擬機) < 256M
    CPU消耗? < 3000ms

    請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
    所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
    注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
    注意:主類的名字必須是:Main,否則按無效代碼處理。
    解析:樹形DP,無向賦權圖,但是并非單純的找生成樹,因為不是每個點都可以用
    import java.util.Scanner;public class Main2 {static Scanner in = new Scanner(System.in);static final int N = 10005;static int[] v = new int[N];static int[] vis = new int[N];static int[][] dp = new int[N][2];static int[][] node = new int[N][N];static int n, sum = 0, max = 0;public static void main(String[] args) {init();dfs(1);int ans = -1;for(int i=1 ;i<=n ;i++){ans = Math.max(ans,dp[i][1]);ans = Math.max(ans,dp[i][0]);}System.out.println(ans);}private static void init() {n = in.nextInt();for (int i = 1; i <= n; i++) {v[i] = in.nextInt();}for (int i = 1; i < n; i++) {int a = in.nextInt();int b = in.nextInt();node[a][b] = 1;node[b][a] = 1;}}private static void dfs(int u) {/*** 選擇 dp[u][1],存放選擇u能得到的最大權值* 不選擇 dp[u][0],存放不選擇u能得到的最大權值* */dp[u][1] = v[u];dp[u][0] = 0;vis[u] = 1;for(int i=1; i<node.length; i++) {/*** 從u可以連到 i,并且未被加入vis中,dfs(i)* */if(node[u][i] != 0 && vis[i] == 0) {dfs(i);dp[u][1] += Math.max(dp[i][1], dp[i][0]);}else{dp[u][1] = Math.max(dp[u][1], v[u]);dp[u][0] = Math.max(dp[u][0], 0);}}} }

    總結

    以上是生活随笔為你收集整理的第六届省赛(软件类)真题----Java大学B组答案及解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。