第五届省赛(软件类)真题----Java大学B组答案及解析
第五屆省賽(軟件類)真題—-Java大學B組答案及解析
一、正則切分
java中提供了對正則表達式的支持。
有的時候,恰當地使用正則,可以讓我們的工作事半功倍!
如下代碼用來檢驗一個四則運算式中數據項的數目,請填寫劃線部分缺少的代碼。
注意:只填寫缺少代碼,不要寫任何多余內容,例如,已有的雙引號。
答案: [-+*/]
二、調和級數
1/1 + 1/2 + 1/3 + 1/4 + … 在數學上稱為調和級數。
它是發散的,也就是說,只要加上足夠多的項,就可以得到任意大的數字。
但是,它發散的很慢:
前1項和達到 1.0
前4項和才超過 2.0
前83項的和才超過 5.0
那么,請你計算一下,要加多少項,才能使得和達到或超過 15.0 呢?
請填寫這個整數。
注意:只需要填寫一個整數,不要填寫任何多余的內容。比如說明文字。
答案:1835421
public class Main {public static void main(String[] args){double sum = 0.0;for (int i = 1; i < 10000000; i++) {sum += 1.0/i;if (sum >= 15.0) {System.out.println(i);break;}}} }三、n的n次冪
如果x的x次冪結果為10(參見【圖1.png】),你能計算出x的近似值嗎?
顯然,這個值是介于2和3之間的一個數字。
請把x的值計算到小數后6位(四舍五入),并填寫這個小數值。
注意:只填寫一個小數,不要寫任何多余的符號或說明。
答案:3.162278
public class Main {public static void main(String[] args) {System.out.println(sqrt(10));}/*** 牛頓迭代法開平方* */public static double sqrt(double c){if(c < 0){return Double.NaN;}double err = 1e-15;double t = c;while(Math.abs(t - c/t) > err*t){t = (c/t + t)/2.0;}return t;} }四、7對數組★
今有7對數字:兩個1,兩個2,兩個3,…兩個7,把它們排成一行。
要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是一個符合要求的排列:
17126425374635
當然,如果把它倒過來,也是符合要求的。
請你找出另一種符合要求的排列法,并且這個排列法是以74開頭的。
注意:只填寫這個14位的整數,不能填寫任何多余的內容,比如說明注釋等。
答案:74151643752362
public class Main {public static int dfs(int[] a, int n) {if(n == 4) {n++;}if(n > 6) {return 1;}for(int i = 3; i <= 14; i++) {if(i == 7 || i == 9) {continue;}if(i+n+1 <= 14 && a[i] == 0 && a[i+n+1] == 0) {a[i] = a[i+n+1] = n;if(dfs(a, n+1) != 0) {return 1;}/*回溯*/a[i] = a[i+n+1] = 0;}}return 0;}public static void main(String[] args) {int[] a = new int[]{0,7,4,0,0,0,0,4,0,7,0,0,0,0,0};dfs(a, 1);for(int i = 1; i <= 14; i++) {System.out.print(a[i]);}} }五、勾股定理
勾股定理,西方稱為畢達哥拉斯定理,它所對應的三角形現在稱為:直角三角形。
已知直角三角形的斜邊是某個整數,并且要求另外兩條邊也必須是整數。
求滿足這個條件的不同直角三角形的個數。
【數據格式】
輸入一個整數 n (0n<10000000) 表示直角三角形斜邊的長度。
要求輸出一個整數,表示滿足條件的直角三角形個數。
例如,輸入:
5
程序應該輸出:
1
再例如,輸入:
100
程序應該輸出:
2
再例如,輸入:
3
程序應該輸出:
0
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
六、九階數獨
你一定聽說過“數獨”游戲。
如【圖1.png】,玩家需要根據9×9盤面上的已知數字,推理出所有剩余空格的數字,并滿足每一行、每一列、每一個同色九宮內的數字均含1-9,不重復。
數獨的答案都是唯一的,所以,多個解也稱為無解。
本圖的數字據說是芬蘭數學家花了3個月的時間設計出來的較難的題目。但對會使用計算機編程的你來說,恐怕易如反掌了。
本題的要求就是輸入數獨題目,程序輸出數獨的唯一解。我們保證所有已知數據的格式都是合法的,并且題目有唯一的解。
格式要求,輸入9行,每行9個字符,0代表未知,其它數字為已知。
輸出9行,每行9個數字表示數獨的解。
例如:
輸入(即圖中題目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
程序應該輸出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
再例如,輸入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
程序應該輸出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 2000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
七、G將軍★
G將軍有一支訓練有素的軍隊,這個軍隊除開G將軍外,每名士兵都有一個直接上級(可能是其他士兵,也可能是G將軍)。現在G將軍將接受一個特別的任務,需要派遣一部分士兵(至少一個)組成一個敢死隊,為了增加敢死隊隊員的獨立性,要求如果一名士兵在敢死隊中,他的直接上級不能在敢死隊中。
請問,G將軍有多少種派出敢死隊的方法。注意,G將軍也可以作為一個士兵進入敢死隊。
輸入格式
輸入的第一行包含一個整數n,表示包括G將軍在內的軍隊的人數。軍隊的士兵從1至n編號,G將軍編號為1。
接下來n-1個數,分別表示編號為2, 3, …, n的士兵的直接上級編號,編號i的士兵的直接上級的編號小于i。
輸出格式
輸出一個整數,表示派出敢死隊的方案數。由于數目可能很大,你只需要輸出這個數除10007的余數即可。
樣例輸入1
3
1 1
樣例輸出1
4
樣例說明
這四種方式分別是:
1. 選1;
2. 選2;
3. 選3;
4. 選2, 3。
樣例輸入2
7
1 1 2 2 3 3
樣例輸出2
40
數據規模與約定
對于20%的數據,n ≤ 20;
對于40%的數據,n ≤ 100;
對于100%的數據,1 ≤ n ≤ 100000。
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 2000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
解析:樹形DP,可以參考Anniversary party 這個題目
import java.util.ArrayList; import java.util.Scanner;public class Main {static ArrayList<Integer>[] list;static long[][] dp;public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();list = new ArrayList[n + 1];for (int i = 1; i <= n; i++) {list[i] = new ArrayList<Integer>();}for (int i = 2; i <= n; i++) {int father = input.nextInt();list[father].add(i);}dp = new long[n + 1][2];dfs(1);System.out.println((dp[1][0] + dp[1][1] - 1) % 10007);}private static void dfs(int u) {/*** 下面兩個dp[][]分別表示 u去 和 u不去* */dp[u][0] = 1;dp[u][1] = 1;/*** 當前節點下的子節點數目* */for (int i = 0; i < list[u].size(); i++) {int v = list[u].get(i);dfs(v);dp[u][0] = dp[u][0] * (dp[v][0] + dp[v][1]) % 10007;dp[u][1] = dp[u][1] * dp[v][0] % 10007;}} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的第五届省赛(软件类)真题----Java大学B组答案及解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate hql getHib
- 下一篇: 第六届省赛(软件类)真题----Java