2016第七屆藍橋杯省賽java B組題解

各題分值:

1.煤球數目(結果填空) 3分
2.生日蠟燭(結果填空) 5分
3.湊算式( 結果填空) 9分
4.分小組( 代碼填空) 11分
5.抽籤( 代碼填空) 13分
6.方格填數( 結果填空) 15分
7.剪郵票( 結果填空) 19分
8.四平方和(編程大題) 21分
9.取球博弈(編程大題) 23分
10.壓縮變換(編程大題) 31分

第一題

題目: 煤球數目

有一堆煤球,堆成三角棱錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形),
第四層10個(排列成三角形), … 如果一共有100層,共有多少個煤球? 請填表示煤球總數目的數字。

一串規律排列,1,(1+2),(1+2+3)…

public class Main {
	public static void main(String[] args) {
		int a=1,b=2,sum=1;
		for (int i = 2; i <= 100; i++) {
			sum += (a+b);
			a+=b;
			b++;
		}
		System.out.println(sum);
	}
}

第二題

題目:生日蠟燭

某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來,他一共吹熄了236根蠟燭。
請問,他從多少歲開始過生日party的? 請填寫他開始過生日party的年齡數。

其實就是求連續數字相加等於236,肯定有唯一結果 求出26再驗證,26+…+33剛好等於236

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
        for(int i=1;i<50;i++) {
        	int sum=0;
        	for(int j=i;j<50;j++) {
        		sum+=j;
        		if(sum==236) {
        			System.out.println(i);
        			j=100;  //退出循環
        			i=100;
        		}else if(sum>236){
        			break;
        		}else {
        			continue;
        		}
        	}
        }
	}
}

第三題

題目:湊算式

       B      DEF
A + --- + ------- = 10
       C      GHI
     
(如果顯示有問題,可以參見下圖)

在這裏插入圖片描述

這個算式中A~I 代表 1~9的數字,不同的字母代表不同的數字。 比如: 6+8/3+952/714 就是一種解法, 5+3/1+972/486 是另一種解法。 這個算式一共有多少種解法? 注意:你提交應該是個整數,不要填寫任何多餘的內容.

全排列問題,暴力解決

import java.util.Scanner;

public class Main {
	
	public static void main(String args[]) {
		Scanner in=new Scanner(System.in);
		int sum=0;
		for(int a=1; a<=9; a++)
			for(int b=1; b<=9; b++) {
				if(b==a) continue;
				for(int c=1; c<=9; c++) {
					if(c==a||c==b) continue;
					for(int d=1; d<=9; d++) {
						if(d==a||d==b||d==c) continue;
						for(int e=1; e<=9; e++) {
							if(e==a||e==b||e==c||e==d) continue;
							for(int f=1; f<=9; f++) {
								if(f==a||f==b||f==c||f==d||f==e) continue;
								for(int g=1; g<=9; g++) {
									if(g==a||g==b||g==c||g==d||g==e||g==f) continue;
									for(int h=1; h<=9; h++) {
								        if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
										for(int i=1; i<=9; i++) {
			                  				if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)continue;
			                  			    //要把其中一個整數先乘以 1.0 轉化成浮點數
											if((a+(b*1.0/c)+(f+e*10+d*100)*1.0/(i+h*10+g*100))==10){
												sum++;	
											}
										}
									}										
								}
							}
						}
					}
				}
			}
		System.out.println(sum);
	}
}

第四題

題目:分小組
(代碼填空)


9名運動員參加比賽,需要分3組進行預賽。
有哪些分組的方案呢?

我們標記運動員爲 A,B,C,... I
下面的程序列出了所有的分組方法。

該程序的正常輸出爲:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH

ABC DFG EHI
ABC DFH EGI
ABC DFI EGH
ABC DGH EFI
ABC DGI EFH
ABC DHI EFG
ABC EFG DHI
ABC EFH DGI
ABC EFI DGH
ABC EGH DFI
ABC EGI DFH
ABC EHI DFG
ABC FGH DEI
ABC FGI DEH
ABC FHI DEG
ABC GHI DEF
ABD CEF GHI
ABD CEG FHI
ABD CEH FGI
ABD CEI FGH
ABD CFG EHI
ABD CFH EGI
ABD CFI EGH
ABD CGH EFI
ABD CGI EFH
ABD CHI EFG
ABD EFG CHI
..... (以下省略,總共560)
public class Main {
	public static String remain(int[] a) {
		String s = "";
		for (int i = 0; i < a.length; i++) {
			if (a[i] == 0)
				s += (char) (i + 'A');
		}
		return s;
	}
 
	public static void f(String s, int[] a) {
		for (int i = 0; i < a.length; i++) {
			if (a[i] == 1)
				continue;
			a[i] = 1;
			for (int j = i + 1; j < a.length; j++) {
				if (a[j] == 1)
					continue;
				a[j] = 1;
				for (int k = j + 1; k < a.length; k++) {
					if (a[k] == 1)
						continue;
					a[k] = 1;
					System.out.println(); // 填空位置
					a[k] = 0;
				}
				a[j] = 0;
			}
			a[i] = 0;
		}
	}
 
	public static void main(String[] args) {
		int[] a = new int[9];
		a[0] = 1;
 
		for (int b = 1; b < a.length; b++) {
			a[b] = 1;
			for (int c = b + 1; c < a.length; c++) {
				a[c] = 1;
				String s = "A" + (char) (b + 'A') + (char) (c + 'A');
				f(s, a);
				a[c] = 0;
			}
			a[b] = 0;
		}
	}
}
答案:s + " "+ (char)(i+'A') + (char)(j+'A') + (char)(k+'A') + " " + remain(a)

第五題

(代碼填空)

**抽籤**
 
X星球要派出一個5人組成的觀察團前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
....
 
那麼最終派往W星的觀察團會有多少種國別的不同組合呢?
 
下面的程序解決了這個問題。
數組a[] 中既是每個國家可以派出的最多的名額。
程序執行結果爲:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,總共101)
 
 
public class A
{
    public static void f(int[] a, int k, int n, String s)
    {
        if(k==a.length){ 
            if(n==0) System.out.println(s);
            return;
        }
        
        String s2 = s;
        for(int i=0; i<=a[k]; i++){
            _____________________________;   //填空位置
            s2 += (char)(k+'A');
        }
    }
    
    public static void main(String[] args)
    {
        int[] a = {4,2,2,1,1,3};
        
        f(a,0,5,"");
    }
}
仔細閱讀代碼,填寫劃線部分缺少的內容。
注意:不要填寫任何已有內容或說明性文字。
*/
答案: f(a,k+1,n-i,s2);

第六題

題目:方格填數
(結果填數)

如下的10個格子
在這裏插入圖片描述
填入0~9的數字。要求:連續的兩個數字不能相鄰。

(左右、上下、對角都算相鄰)

一共有多少種可能的填數方案?

請填寫表示方案數目的整數。

全排列再判斷是否合法,從第一層開始標記0,1…

package lansuan;
 
import java.util.Arrays;
 
public class _方格填數 {
 
	static int cnt = 0;
	static int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
		p(0);
		System.out.println(cnt);
	}
 
	public static void p(int k) {
 
		if (k == 10) {
			boolean f = check();
			if (f) {
				cnt++;
			}
			return;
		}
 
		for (int i = k; i < a.length; i++) {
			int t = a[i];
			a[i] = a[k];
			a[k] = t;
			p(k + 1);
			t = a[i];
			a[i] = a[k];
			a[k] = t;
		}
	}
 
	private static boolean check() {
		// TODO Auto-generated method stub
		if (Math.abs(a[0] - a[1]) == 1 || 
			Math.abs(a[0] - a[3]) == 1 || 
			Math.abs(a[0] - a[4]) == 1 || 
			Math.abs(a[0] - a[5]) == 1 ||
			
			Math.abs(a[1] - a[2]) == 1 || 
			Math.abs(a[1] - a[4]) == 1 || 
			Math.abs(a[1] - a[5]) == 1 || 
			Math.abs(a[1] - a[6]) == 1 ||
			
			Math.abs(a[2] - a[5]) == 1 || 
			Math.abs(a[2] - a[6]) == 1 || 
			
			Math.abs(a[3] - a[4]) == 1 || 
			Math.abs(a[3] - a[7]) == 1 || 
			Math.abs(a[3] - a[8]) == 1 ||
			
			Math.abs(a[4] - a[5]) == 1 || 
			Math.abs(a[4] - a[7]) == 1 || 
			Math.abs(a[4] - a[8]) == 1 || 
			Math.abs(a[4] - a[9]) == 1 ||
			
			Math.abs(a[5] - a[6]) == 1 || 
			Math.abs(a[5] - a[8]) == 1 || 
			Math.abs(a[5] - a[9]) == 1 ||
			
			Math.abs(a[6] - a[9]) == 1 ||
			
			Math.abs(a[7] - a[8]) == 1 ||
			
			Math.abs(a[8] - a[9]) == 1 )
			return false;
		return true;
	}
}
答案:1580

7,8,9,10暫時沒寫
https://blog.csdn.net/qq_41921315/article/details/88613604

第七題

題目:剪郵票

如【圖1.jpg】, 有12張連在一起的12生肖的郵票。 現在你要從中剪下5張來,要求必須是連着的。 (僅僅連接一個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。 請你計算,一共有多少種不同的剪取方法。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

第八題

題目:四平方和

四平方和定理,又稱爲拉格朗日定理: 
每個正整數都可以表示爲至多4個正整數的平方和。 
如果把0包括進去,就正好可以表示爲4個數的平方和。

比如:

5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
1
2^符號表示乘方的意思)

對於一個給定的正整數,可能存在多種平方和的表示法。 
要求你對4個數排序: 
0 <= a <= b <= c <= d 
並對所有的可能表示法按 a,b,c,d 爲聯合主鍵升序排列,最後輸出第一個表示法

程序輸入爲一個正整數N (N<5000000) 
要求輸出4個非負整數,按從小到大排序,中間用空格分開 
例如,輸入: 
5 
則程序應該輸出: 
0 0 1 2

再例如,輸入: 
12 
則程序應該輸出: 
0 2 2 2

再例如,輸入: 
773535 
則程序應該輸出: 
1 1 267 838

第九題

題目:取球博弈

兩個人玩取球的遊戲。
一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個數目。
如果無法繼續取球,則遊戲結束。
此時,持有奇數個球的一方獲勝。
如果兩人都是奇數,則爲平局。

假設雙方都採用最聰明的取法,
第一個取球的人一定能贏嗎?
試編程解決這個問題。

輸入格式:
第一行3個正整數n1 n2 n3,空格分開,表示每次可取的數目 (0<n1,n2,n3<100)
第二行5個正整數x1 x2 ... x5,空格分開,表示5局的初始球數(0<xi<1000)

輸出格式:
一行5個字符,空格分開。分別表示每局先取球的人能否獲勝。
能獲勝則輸出+,
次之,如有辦法逼平對手,輸出0,
無論如何都會輸,則輸出-
例如,輸入:
1 2 3
1 2 3 4 5
程序應該輸出:
+ 0 + 0 -
再例如,輸入:
1 4 5
10 11 12 13 15
程序應該輸出:
0 - 0 + +
再例如,輸入:
2 3 5
7 8 9 10 11
程序應該輸出:
+ 0 0 0 0

第十題

題目:壓縮變換

小明最近在研究壓縮算法。
他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。
然而,要使數值很小是一個挑戰。
最近,小明需要壓縮一些正整數的序列,這些序列的特點是,後面出現的數字很大可能是剛出現過不久的數字。對於這種特殊的序列,小明準備對序列做一個變換來減小數字的值。


變換的過程如下:
從左到右枚舉序列,每枚舉到一個數字,如果這個數字沒有出現過,剛將數字變換成它的相反數,如果數字出現過,則看它在原序列中最後的一次出現後面(且在當前數前面)出現了幾種數字,用這個種類數替換原來的數字。


比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在變換過程爲:
a1: 1未出現過,所以a1變爲-1;
a2: 2未出現過,所以a2變爲-2;
a3: 2出現過,最後一次爲原序列的a2,在a2後、a3前有0種數字,所以a3變爲0;
a4: 1出現過,最後一次爲原序列的a1,在a1後、a4前有1種數字,所以a4變爲1;
a5: 2出現過,最後一次爲原序列的a3,在a3後、a5前有1種數字,所以a5變爲1。
現在,給出原序列,請問,按這種變換規則變換後的序列是什麼。
輸入格式:
輸入第一行包含一個整數n,表示序列的長度。
第二行包含n個正整數,表示輸入序列。


輸出格式:
輸出一行,包含n個數,表示變換後的序列。
例如,輸入:
5
1 2 2 1 2
程序應該輸出:
-1 -2 0 1 1
再例如,輸入:
12
1 1 2 3 2 3 1 2 2 2 3 1
程序應該輸出:
-1 0 -2 -3 1 1 2 2 0 0 2 2
數據規模與約定
對於30%的數據,n<=1000;
對於50%的數據,n<=30000;
對於100%的數據,1 <=n<=1000001<=ai<=10^9
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章