第六屆藍橋杯大賽個人賽省賽(軟體類)真題 Java語言B組 答案
以下程式碼純自想自打,如有誤,請提出,如可簡,請告之,謝謝大家了。
1
三角形面積
如【圖1】所示。圖中的所有小方格面積都是1。
那麼,圖中的三角形面積應該是多少呢?
請填寫三角形的面積。不要填寫任何多餘內容或說明性文字。
答案:28
public class Main {
public static void main(String[] args) {
float s1 = 2*8/2;
float s2 = 4*6/2;
float s3 = 4*8/2;
float s = 8*8-s1-s2-s3;
System.out.print(s);
}
}
2
立方變自身
觀察下面的現象,某個數字的立方,按位累加仍然等於自身。
1^3 = 1
8^3 = 512 5+1+2=8
17^3 = 4913 4+9+1+3=17
...
請你計算包括1,8,17在內,符合這個性質的正整數一共有多少個?
請填寫該數字,不要填寫任何多餘的內容或說明性的文字。
答案:6
public class Main { public static void main(String[] args) { int sum=0; for(int i=1;i<100;i++) { int n=i*i*i; String s=n+""; int m=0; for(int j=0;j<s.length();j++) { m+=Integer.parseInt(s.charAt(j)+""); } if(m==i) { sum++; } } System.out.print(sum); } }
3
三羊獻瑞
觀察下面的加法算式:
祥 瑞 生 輝
+ 三 羊 獻 瑞
-------------------
三 羊 生 瑞 氣
(如果有對齊問題,可以參看【圖1.jpg】)
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。
答案:1085
public class Main { static int a() { for(int a=1;a<10;a++) for(int b=0;b<10;b++) { if(b==a)continue; for(int c=0;c<10;c++) { if(a==c||b==c)continue; for(int d=0;d<10;d++) { if(a==d||b==d||c==d)continue; for(int e=1;e<10;e++) { if(a==e||b==e||c==e||d==e)continue; for(int f=0;f<10;f++) { if(a==f||b==f||c==f||d==f||e==f)continue; for(int g=0;g<10;g++) { if(a==g||b==g||c==g||d==g||e==g||f==g)continue; for(int h=0;h<10;h++) { if(a==h||b==h||c==h||d==h||e==h||f==h||g==h)continue; if(a*1000+b*100+c*10+d+e*1000+f*100+g*10+b==e*10000+f*1000+c*100+b*10+h) { return e*1000+f*100+g*10+b; } } } } } } } } return 0; } public static void main(String[] args) { System.out.print(a()); } }
4
迴圈節長度
兩個整數做除法,有時會產生迴圈小數,其迴圈部分稱為:迴圈節。
比如,11/13=6=>0.846153846153..... 其迴圈節為[846153] 共有6位。
下面的方法,可以求出迴圈節的長度。
請仔細閱讀程式碼,並填寫劃線部分缺少的程式碼。
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) _________________________________ ; //填空
}
}
注意,只能填寫缺少的部分,不要重複抄寫已有程式碼。不要填寫任何多餘的文字。
答案:return v.size()-v.indexOf(n)
5
九陣列分數
1,2,3...9 這九個數字組成一個分數,其值恰好為1/3,如何組法?
下面的程式實現了該功能,請填寫劃線部分缺失的程式碼。
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;}
6
加法變乘法
我們都知道:1+2+3+ ... + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,並把位置靠前的那個乘號左邊的數字提交(對於示例,就是提交10)。
注意:需要你提交的是一個整數,不要填寫任何多餘的內容。
答案:16
public class Main {
public static void main(String[] args) {
int sum=0;
for(int a=1;a<=46;a++)
{
for(int b=a+2;b<=48;b++)
{
sum=0;
for(int i=1;i<=49;i++)
{
if(a==i){
sum+=a*(a+1);
i++;
}
else if(b==i){
sum+=b*(b+1);
i++;
}
else sum+=i;
}
if(sum==2015)System.out.println(a);
}
}
}
}
7
牌型種數
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裡突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?
請填寫該整數,不要填寫任何多餘的內容或說明文字。
答案:3598180
public class Main {
public static void main(String[] args) {
s(0,1);
System.out.print(n);
}
static int n=0;//組合種數
static void s(int sum,int a) //sum為總選擇的牌數,a為當前牌的數字
{
if(a<=14) //因最後選擇13牌後會遞迴一次選擇14牌,13==sum會在14牌那判斷,故a<=14
{
if(13==sum){n++;return;} //13張牌選完後,種數n++
if(sum<=9)s(sum+4,a+1); //如果總選擇牌數<=9,則可選4張a牌,選完後遞迴選擇a+1牌
if(sum<=10)s(sum+3,a+1); //如果總選擇牌數<=10,則可選3張a牌
if(sum<=11)s(sum+2,a+1); //如果總選擇牌數<=11,則可選2張a牌
if(sum<=12)s(sum+1,a+1); //如果總選擇牌數<=12,則可選1張a牌
if(sum<=13)s(sum,a+1); //如果總選擇牌數<=13,則可選0張a牌
}
}
}
8
飲料換購
樂羊羊飲料廠正在舉辦一次促銷優惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,並且可以一直迴圈下去,但不允許賒賬。
請你計算一下,如果小明不浪費瓶蓋,儘量地參加活動,那麼,對於他初始買入的n瓶飲料,最後他一共能得到多少瓶飲料。
輸入:一個整數n,表示開始購買的飲料數量(0<n<10000)
輸出:一個整數,表示實際得到的飲料數
例如:
使用者輸入:
100
程式應該輸出:
149
使用者輸入:
101
程式應該輸出:
151
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt(); //瓶蓋
int m=n; //飲料
while(n>=3)
{
n=n-2;
m++;
}
System.out.print(m);
}
}
9
壘骰子
賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!
我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,骰子就不能穩定的壘起來。 atm想計算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數字的朝向都相同。
由於方案數可能過多,請輸出模 10^9 + 7 的結果。
不要小看了 atm 的骰子數量哦~
「輸入格式」
第一行兩個整數 n m
n表示骰子數目
接下來 m 行,每行兩個整數 a b ,表示 a 和 b 不能緊貼在一起。
「輸出格式」
一行一個數,表示答案模 10^9 + 7 的結果。
「樣例輸入」
2 1
1 2
「樣例輸出」
544
「資料範圍」
對於 30% 的資料:n <= 5
對於 60% 的資料:n <= 100
對於 100% 的資料:0 < n <= 10^9, m <= 36
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 2000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
import java.util.Scanner;
public class Main {
static long sum=0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n=scanner.nextInt();
int m=scanner.nextInt();
int k[][]=new int[7][7];
for(int i=0;i<m;i++)
{
int a=scanner.nextInt();
int b=scanner.nextInt();;
k[a][b]=1;k[b][a]=1;
}
a(1,0,n,k);
long c = (long)Math.pow(4, n);
System.out.print(sum*c);
}
static void a(int a,int befup,long n,int k[][]) //第a個骰子,上一骰子上面為數字befup
{
for(int b=1;b<=6;b++) //底面數字b
{
if(k[b][befup]!=1){
if(a==n)
{
sum++;
continue;
}
a(a+1,opposite(b),n,k);
}
}
}
static int opposite(int a)
{
if(a==1)return 4;
if(a==2)return 5;
if(a==3)return 6;
if(a==4)return 1;
if(a==5)return 2;
if(a==6)return 3;
return 0;
}
}
10
生命之樹
在X森林裡,上帝建立了生命之樹。
他給每棵樹的每個節點(葉子也稱為一個節點)上,都標了一個整數,代表這個點的和諧值。
上帝要在這棵樹內選出一個非空節點集S,使得對於S中的任意兩個點a,b,都存在一個點列 {a, v1, v2, ..., vk, b} 使得這個點列中的每個點都是S裡面的元素,且序列中相鄰兩個點間有一條邊相連。
在這個前提下,上帝要使得S中的點所對應的整數的和儘量大。
這個最大的和就是上帝給生命之樹的評分。
經過atm的努力,他已經知道了上帝給每棵樹上每個節點上的整數。但是由於 atm 不擅長計算,他不知道怎樣有效的求評分。他需要你為他寫一個程式來計算一棵樹的分數。
「輸入格式」
第一行一個整數 n 表示這棵樹有 n 個節點。
第二行 n 個整數,依次表示每個節點的評分。
接下來 n-1 行,每行 2 個整數 u, v,表示存在一條 u 到 v 的邊。由於這是一棵樹,所以是不存在環的。
「輸出格式」
輸出一行一個數,表示上帝給這棵樹的分數。
「樣例輸入」
5
1 -2 -3 4 5
4 2
3 1
1 2
2 5
「樣例輸出」
8
「資料範圍」
對於 30% 的資料,n <= 10
對於 100% 的資料,0 < n <= 10^5, 每個節點的評分的絕對值不超過 10^6 。
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 3000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
import java.util.Scanner;
public class Main {
static int sum=0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m[]=new int[n+1];
int a[][] = new int[n+1][n+1];
for(int i=1;i<=n;i++)
{
m[i]=scanner.nextInt();
}
for(int i=0;i<n-1;i++){
int u = scanner.nextInt();
int v = scanner.nextInt();
a[u][v] = 1;
a[v][u] = 1;
}
int k[] = new int[n+1];
a(1,n,0,m,a,k,0);
System.out.print(sum);
}
static void a(int i,int n,int s,int m[],int a[][],int k[],int num)
{
num++;
for(;i<=n;i++)
{
k[num]=i;
if(!judge(a,k,num))continue;
s+=m[i];
if(sum<s)sum=s;
if(i+1<=n)
a(i+1,n,s,m,a,k,num);
s-=m[i];
}
}
static boolean judge(int a[][],int k[],int num)
{
if(num==1)return true;
int n=0;
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
if(a[k[i]][k[j]]==1){
n++;
break;
}
if(n==num)return true;
return false;
}
}
以上