1. 程式人生 > >第六屆藍橋杯大賽個人賽省賽(軟體類)真題 Java語言B組 答案

第六屆藍橋杯大賽個人賽省賽(軟體類)真題 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;
		
	}
	
}
以上