1. 程式人生 > >第五屆藍橋杯java B組國賽題目

第五屆藍橋杯java B組國賽題目

1.標題:國王的遺產
  X國是個小國。國王K有6個兒子。在臨終前,K國王立下遺囑:國王的一批牛作為遺產要分給他的6個兒子。
    其中,大兒子分1/4,二兒子1/5,三兒子1/6,....
    直到小兒子分1/9。
    牛是活的,不能把一頭牛切開分。
    最後還剩下11頭牛,分給管家。
    請計算國王這批遺產中一共有多少頭牛。
    這是一個整數,請通過瀏覽器提交答案,不要填寫任何多餘的內容(比如說明性的文字)

    思路:直接暴力

我的答案:2520

public class Main{
	public static void main(String[] args) {
		int n = 20;
		int temp;
		while(true){
			if(n % 4 == 0 && n % 5 == 0 && n % 6 == 0 && n % 7 == 0 && n % 8 == 0 && n % 9 == 0){
				temp = n - n/4 - n/5 - n/6 - n/7 -n/8 - n/9;
				if(temp == 11) {
					System.out.println(n);
					return;
				}else{
					n++;
				}
			}else {
				n++;
			}
			
		}
	}
}

2.標題:六角幻方
 把 1 2 3 ... 19 共19個整數排列成六角形狀,如下:
    * * *
   * * * *
  * * * * *
   * * * * 
    * * *
   要求每個直線上的數字之和必須相等。共有15條直線哦!

   再給點線索吧!我們預先填好了2個數字,第一行的頭兩個數字是:15 13,參見圖【p1.png】,黃色一行為所求。


   請你填寫出中間一行的5個數字。數字間用空格分開。

   這是一行用空格分開的整數,請通過瀏覽器提交答案,不要填寫任何多餘的內容(比如說明性的文字等)

思路:dfs

我的答案:9 6 5 2 16 

public class Main{
	static int table[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
	public static void main(String[] args) {
		int arr[] = new int[17];
		boolean step[] = new boolean[20];
		step[15] = step[13] = true;
		dfs(arr, 0, step);
	}
	public static void dfs(int[] arr, int ws, boolean[] step) {
		if(ws == 5) {
			if(28 + arr[0] != arr[1] + arr[2] + arr[3] + arr[4]){
				return ;
			}
		}
		if(ws == 6) {
			if(28 + arr[0] != 15 + arr[1] + arr[5]) {
				return;
			}
		}
		if(ws == 10) {
			if(28 + arr[0] != arr[5] + arr[6] + arr[7] + arr[8] + arr[9])return;
			if(28 + arr[0] != arr[0] + arr[4] + arr[9]) return ;
		}
		if(ws == 11) {
			if(28 + arr[0] != 13 + arr[2] + arr[6] + arr[10]) return;
		}
		if(ws == 14) {
			if(28 + arr[0] != arr[10] + arr[11] + arr[12] + arr[13])return;
			if(28 + arr[0] != 13 + arr[3] + arr[8] + arr[13]) return;
		}
		if(ws == 15) {
			if(28 + arr[0] != arr[5] + arr[10] + arr[14]) return;
			if(28 + arr[0] != arr[0] + arr[3] + arr[7] + arr[11] + arr[14])return;
		}
		  if (ws == 17)  
	        {  
	            if (28 + arr[0] != arr[14] + arr[15]+arr[16]) return;  
	            if (28 + arr[0] !=15+ arr[2]+arr[7] + arr[12]+arr[16]) return;  
	            if (28 + arr[0] != arr[9] + arr[13] + arr[16]) return;  
	              
	            output(arr);return;  
	        }  
		  for(int i = 0; i < table.length; i++) {
			  if(step[table[i]] == false) {
				  step[table[i]] = true;
				  arr[ws] = table[i];
				  dfs(arr, ws + 1, step);
				  step[table[i]] = false;
			  }
		  }
	}
	public static void output(int[] arr) {
		for(int i = 5; i <= 9; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
}

3.標題:格子放雞蛋
   X星球的母雞很聰明。它們把蛋直接下在一個 N * N 的格子中,每個格子只能容納一枚雞蛋。它們有個習慣,要求:每行,每列,以及每個斜線上都不能有超過2個雞蛋。如果要滿足這些要求,母雞最多能下多少蛋呢,有多少種擺放方法呢?
    下面的程式解決了這個問題,請仔細分析程式邏輯,推斷劃線處缺少的程式碼。
public class A
{
static int max = 0;
static int T = 0;
static final int N = 6;

// 只能在(r,c) 以及其右,其下放置 
static void f(int[][] da, int r, int c)
{
if(r>=N){
int n = count(da);
if(n>max) {
max = n;
T = 0;
}
if(n==max) T++;
return;
}

//計算一下步放哪
int r_next = r;
int c_next = c + 1;
if(c_next>=N){
c_next = 0;
r_next++;
}

if(____________________){  // 填空位置
da[r][c] = 1;
f(da, r_next, c_next); 
}

da[r][c] = 0;
f(da, r_next, c_next);
}

static int count(int[][] da)
{
int n = 0;

for(int i=0; i<da.length; i++)
for(int j=0; j<da[i].length; j++) 
if(da[i][j]==1) n++;

return n;
}

static int spy(int[][] da, int r, int c)
{
int m=0;

// 該行
int n=0;
for(int i=0; i<N; i++) if(da[r][i]==1) n++;
if(n>m) m = n;


//該列
n=0;
for(int i=0; i<N; i++) if(da[i][c]==1) n++;
if(n>m) m = n;

//右斜線
n=0;
for(int i=0; i<N; i++){ 
if(r-i<0 || c-i<0) break; 
if(da[r-i][c-i]==1) n++;
}
for(int i=1; i<N; i++){ 
if(r+i>=N || c+i>=N) break; 
if(da[r+i][c+i]==1) n++;
}
if(n>m) m = n;

//左斜線
n=0;
for(int i=0; i<N; i++){ 
if(r-i<0 || c+i>=N) break; 
if(da[r-i][c+i]==1) n++;
}
for(int i=1; i<N; i++){ 
if(r+i>=N || c-i<0) break; 
if(da[r+i][c-i]==1) n++;
}
if(n > m) m = n;

return m;
}

public static void main(String[] args)
{
int[][] da = new int[N][N];

f(da, 0, 0);

System.out.println(max);
System.out.println(T);
}
}

注意:通過瀏覽器提交答案。只填寫缺少的內容,不要填寫任何多餘的內容(例如:說明性文字或已有符號)。

答案: spy(da, r, c) <= 1
 12  1097

4.標題:排列序數
如果用a b c d這4個字母組成一個串,有4!=24種,如果把它們排個序,每個串都對應一個序號:
  abcd  0
  abdc  1
  acbd  2
  acdb  3
  adbc  4
  adcb  5
  bacd  6
  badc  7
  bcad  8
  bcda  9
  bdac  10
  bdca  11
  cabd  12
  cadb  13
  cbad  14
  cbda  15
  cdab  16
  cdba  17
  ...
    現在有不多於10個兩兩不同的小寫字母,給出它們組成的串,你能求出該串在所有排列中的序號嗎?
【輸入格式】
一行,一個串。
【輸出格式】
一行,一個整數,表示該串在其字母所有排列生成的串中的序號。注意:最小的序號是0。
例如:
輸入:
bdca
程式應該輸出:
11
再例如:
輸入:
cedab
程式應該輸出:
70
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms

思路:先對輸入的序列按字典序進行排序,然後根據該序列進行dfs全排,再判斷

import java.util.Arrays;
import java.util.Scanner;

public class Main
{
	public static char[] array;
	public static boolean flag[];
	public static char[] all_p;
	public static int count = 0;
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String string = in.next();
		array = string.toCharArray();
		Arrays.sort(array);
		//System.out.println(String.valueOf(array));
		flag = new boolean[array.length];
		all_p = new char[array.length];
		dfs(0, string);
	}
	public static void dfs(int n, String string) {
		if(n == array.length) {
			//System.out.println(String.valueOf(all_p));
			if(string.equals(String.valueOf(all_p))){
				System.out.println(count);
			}
			count++;
			return;
		}
		
		for(int i = 0; i < array.length; i++) {
			if(!flag[i]){
				flag[i] = true;
				all_p[n] = array[i];
				dfs(n + 1, string);
				flag[i] = false;
			}
		}
		
	}
}



5.標題:冪一矩陣
    天才少年的鄰居 atm 最近學習了線性代數相關的理論,他對“矩陣”這個概念特別感興趣。矩陣中有個概念叫做冪零矩陣。對於一個方陣 M ,如果存在一個正整數 k 滿足 M^k = 0 ,那麼 M 就是一個冪零矩陣。(^ 表示乘方)
    atm 不滿足冪零矩陣,他自己設想了一個冪一矩陣:對於一個方陣 M ,如果存在一個正整數 k 滿足 M^k = I ,其中 I 是單位矩陣,那麼 M 就是一個冪一矩陣。
    atm 特別鍾情於這樣一種方陣:每行每列有且僅有一個 1 。經過 atm 不斷實驗,他發現這種矩陣都是冪一矩陣。
   現在,他的問題是,給定一個滿足以上條件的方陣,他想求最小的 k 是多少。
【輸入格式】
第一行一個正整數 n ,表示矩陣大小是 n * n 。
接下來 n 行,每行兩個正整數 i j 表示方陣的第 i 行第 j 列為 1。
1 <= i, j <= n 。
行號,列號都從1開始。
【輸出格式】
一行。一個正整數,即題目中所說最小的 k 。
【樣例輸入】
5
3 1
1 2
4 4
2 3
5 5
【樣例輸出】
3
【資料範圍】
對於 30% 的資料滿足 n <= 10 
對於 60% 的資料答案不超過 10^18 
對於 100% 的資料滿足 n <= 10000

資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms

    

6.標題:供水設施

 X星球的居民點很多。Pear決定修建一個浩大的水利工程,以解決他管轄的N個居民點的供水問題。現在一共有N個水塔,同時也有N個居民點,居民點在北側從1號到N號自西向東排成一排;水塔在南側也從1號到N號自西向東排成一排。
    N條單向輸水線(有水泵動力),將水從南側的水塔引到北側對應的居民點。
    我們不妨將居民點和水塔都看做平面上的點,居民點座標為(1,K)~(N,K),水塔為(1,0)~(N,0)。
    除了N條縱向輸水線以外,還有M條單向的橫向輸水線,連線(Xi,Yi)和(Xi,(Yi)+1)或者(Xi,Yi)和(Xi,(Yi)-1)。前者被稱為向右的水路,而後者是向左的。不會有兩條水路重疊,即便它們方向不同。

    佈局的示意圖如:【p1.png】所示。


    顯然,每個水塔的水都可以到達若干個居民點(而不僅僅是對應的那個)。例如上圖中,4號水塔可以到達3、4、5、6四個居民點。
 現在Pear決定在此基礎上,再修建一條橫向單項輸水線。為了方便考慮,Pear認為這條水路應當是自左向右的,也就是連線了一個點和它右側的點(例如上圖中連線5和6兩個縱線的橫向水路)。
    Pear的目標是,修建了這條水路之後,能有儘可能多對水塔和居民點之間能到達。換句話說,設修建之後第i個水塔能到達Ai個點,你要最大化A1+A2+...+An。
    根據定義,這條路必須和X軸平行,但Y座標不一定要是整數。注意:雖然輸入中沒有重疊的水路,但是你的方案可以將新修的輸水線路與已有的水路重疊。
【輸入資料】
    輸入第一行包含三個正整數N,M,K,含義如題面所述:N是縱向線數,M橫向線數,K是居民點縱座標。
    接下來M行,每行三個整數。前兩個正整數Xi Yi表示水路的起點座標;
    1<=Xi<=N,0<Yi<K。
    接下來一個數0或者1,如果是0表示這條水路向左,否則向右。
    保證水路都是合法的,也就是不會流向沒有定義的地方。
【輸出資料】
輸出一行。是一個正整數,即:題目中要求的最大化的A1+A2+...+An。
【輸入樣例1】
4 3 2
1 1 1
3 1 0
3 1 1
【輸出樣例1】
11
【輸入樣例2】
7 9 4
2 3 0
7 2 0
6 3 1
6 1 0
2 1 1
3 3 1
5 2 0
2 2 1
7 1 0
【輸出樣例2】
21
【資料範圍】
對於20%的資料,N,K<=20,M<=100
對於40%的資料,N,K<=100,M<=1000
對於60%的資料,N,K<=1000,M<=100000
對於100%的資料,N,K<=50000,M<=100000

資源約定:
峰值記憶體消耗(含虛擬機器) < 256M

CPU消耗  < 5000ms

相關推薦

藍橋java B題目

1.標題:國王的遺產  X國是個小國。國王K有6個兒子。在臨終前,K國王立下遺囑:國王的一批牛作為遺產要分給他的6個兒子。    其中,大兒子分1/4,二兒子1/5,三兒子1/6,....    直到小兒子分1/9。    牛是活的,不能把一頭牛切開分。    最後還剩下11

藍橋Java B真題——猜字母

package lanqiaobei; /* 標題:猜字母 把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。 接下來刪除第1個字母(即開頭的字母a),

藍橋JAVA B-四平方和試題

四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 +

藍橋JAVA B題解

第一題 標題: 購物單 小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。 這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。 小明也有個怪癖,不到萬不得已,從不刷卡,直接

2017藍橋Java B第一題:購物單

第一題 標題: 購物單 小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。 這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。 小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定

藍橋本科B題目解析

一、題目標題: 高斯日記     大數學家高斯有個好習慣:無論如何都要記日記。     他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210     後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻

藍橋java b三題

watermark alt args 暴力破解 out col HR sdn oid 第三題 三羊獻瑞 觀察下面的加法算式: 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。 請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多余內容。 答案這個題目

藍橋java b第一題

都是 text nbsp post ppa hbm 藍橋杯 文字 fill 第一題 三角形面積 圖中的所有小方格面積都是1。 那麽,圖中的三角形面積應該是多少呢? 請填寫三角形的面積。不要填寫任何多余內容或說明性文字。 填空答案 28 沒什麽好說的 第一題很水 估計

藍橋java b8題

CP stat exti 要求 得到 嚴格 else scan 內容 樂羊羊飲料廠正在舉辦一次促銷優惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,並且可以一直循環下去,但不允許賒賬。 請你計算一下,如果小明不浪費瓶蓋,盡量地參加活動,那麽,對於他初始買入的n瓶飲料

藍橋-藍橋java B決賽

一、憤怒小鳥 X星球憤怒的小鳥喜歡撞火車!  一根平直的鐵軌上兩火車間相距 1000 米 兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。 憤怒的小鳥從A車出發,時速50米/秒,撞向B車, 然後返回去撞A車,再返回去撞B車,如此往復.... 兩火車在相距1米處停車。

藍橋JAVA B【省

一.標題: 購物單小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定。現在小明很心煩

藍橋 java B 日期問題

標題:日期問題 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有采用年/月/日的,有采用月/日/年的, 還有采用日/月/年的。更加麻煩的是,年份也都

藍橋Java B決賽試題

1.憤怒小鳥X星球憤怒的小鳥喜歡撞火車!一根平直的鐵軌上兩火車間相距 1000 米兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。憤怒的小鳥從A車出發,時速50米/秒,撞向B車,然後返回去撞A車,再返回去撞B車,如此往復....兩火車在相距1米處停車。問:這期間憤怒的

藍橋java B試題之分小組小題

9名運動員參加比賽,需要分3組進行預賽。 有哪些分組的方案呢? 我們標記運動員為 A,B,C,… I 下面的程式列出了所有的分組方法。 該程式的正常輸出為: ABC DEF GHI ABC DEG FHI ABC DEH FGI ABC DEI

2017年藍橋 C++A 第二題 生命遊戲 題解

生命遊戲 康威生命遊戲是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。 這個遊戲在一個無限大的2D網格上進行。 初始時,每個小方格中居住著一個活著或死了的細胞。 下一時刻每個細胞的狀態都由它周圍八個格子的細胞狀態決定。 具體來說:

2014年藍橋JAVA/JAVA++程式設計本科B決賽 出棧次序(結果填空)

出棧次序 X星球特別講究秩序,所有道路都是單行線。一個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。 路邊有個死衚衕,只能容一輛車通過,是臨時的檢查站,如圖【p1.png】所示。 X星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。 如果車輛進

2014藍橋JAVA本科B試題三題猜字母

把abcd...s共19個字母組成的序列重複拼接106次,得到長度為2014的串。    接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。    得到的新串再進行刪除奇數位置字母的動作。如此下去,最後只剩下一個字母,請寫出該字母。答案是一個小寫

藍橋Java語言C_調和級數

1/1 + 1/2 + 1/3 + 1/4 + ... 在數學上稱為調和級數。 它是發散的,也就是說,只要加上足夠多的項,就可以得到任意大的數字。 但是,它發散的很慢: 前1項和達到 1.0 前4項

藍橋Java/A

題目:廣場舞 LQ市的市民廣場是一個多邊形,廣場上鋪滿了大理石的地板磚。 地板磚鋪得方方正正,就像座標軸紙一樣。 以某四塊磚相接的點為原點,地板磚的兩條邊為兩個正方向,一塊磚的邊長為橫縱座標的單位長度,則所有橫縱座標都為整數的點都是四塊磚的交點(如果在廣場內)。 廣場的

藍橋Java語言C_單位分數

形如:1/a 的分數稱為單位分數。 可以把1分解為若干個互不相同的單位分數之和。 例如: 1 = 1/2 + 1/3 + 1/9 + 1/18 1 = 1/2 + 1/3 + 1/10 + 1/15