2018年藍橋杯B組C/C++決賽題目


自己的博客排版,自我感覺略好一點。
先放上題目。

點擊查看2018年藍橋杯B組C/C++決賽題目題解

 
 

1.換零鈔

x星球的鈔票的面額只有:100元,5元,2元,1元,共4種。
小明去x星旅游,他手里只有2張100元的x星幣,太不方便,恰好路過x星銀行就去換零錢。
小明有點強迫症,他堅持要求200元換出的零鈔中2元的張數剛好是1元的張數的10倍,
剩下的當然都是5元面額的。
銀行的工作人員有點為難,
你能幫助算出:
在滿足小明要求的前提下,
最少要換給他多少張鈔票嗎?
(5元,2元,1元面額的必須都有,不能是0)

 
 

2.激光樣式

x星球的盛大節日為增加氣氛,用30台機光器一字排開,向太空中打出光柱。
安裝調試的時候才發現,不知什么原因,相鄰的兩台激光器不能同時打開!
國王很想知道,在目前這種bug存在的情況下,一共能打出多少種激光效果?
顯然,如果只有3台機器,一共可以成5種樣式,即:
全都關上(sorry, 此時無聲勝有聲,這也算一種)
開一台,共3種
開兩台,只1種

30台就不好算了,國王只好請你幫忙了。
要求提交一個整數,表示30台激光器能形成的樣式種數。

 
 

3.格雷碼

格雷碼是以n位的二進制來表示數。
與普通的二進制表示不同的是,它要求相鄰兩個數字只能有1個數位不同。
首尾兩個數字也要求只有1位之差。

有很多算法來生成格雷碼。以下是較常見的一種:
從編碼全0開始生成。
當產生第奇數個數時,只把當前數字最末位改變(0變1,1變0)
當產生第偶數個數時,先找到最右邊的一個1,把它左邊的數字改變。
用這個規則產生的4位格雷碼序列如下:
0000
0001
0011   
0010
0110   
0111
0101   
0100
1100   
1101
1111   
1110
1010   
1011
1001   
1000

以下是實現代碼,仔細分析其中邏輯,並填寫划線部分缺少的代碼。

#include <stdio.h>
void show(int a,int n)
{
	int i;
	int msk = 1;
	for(i=0; i<n-1; i++) msk = msk << 1;
	for(i=0; i<n; i++){
		printf((a & msk)? "1" : "0");
		msk = msk >> 1;
	}
	printf("\n");
} 


void f(int n)
{
	int i;
	int num = 1;
	for(i=0; i<n; i++) num = num<<1;
	
	int a = 0;
	for(i=0; i<num; i++){
		show(a,n);
		
		if(i%2==0){
			a = a ^ 1;
		}
		else{
			a = _________________________ ; //填空
		}
	}
}


int main()
{
	f(4);
	return 0;
}

 
 

4.調手表

小明買了塊高端大氣上檔次的電子手表,他正准備調時間呢。
在 M78 星雲,時間的計量單位和地球上不同,M78 星雲的一個小時有 n 分鍾。
大家都知道,手表只有一個按鈕可以把當前的數加一。在調分鍾的時候,如果當前顯示的數是 0 ,那么按一下按鈕就會變成 1,再按一次變成 2 。如果當前的數是 n - 1,按一次后會變成 0 。
作為強迫症患者,小明一定要把手表的時間調對。如果手表上的時間比當前時間多1,則要按 n - 1 次加一按鈕才能調回正確時間。
小明想,如果手表可以再添加一個按鈕,表示把當前的數加 k 該多好啊……
他想知道,如果有了這個 +k 按鈕,按照最優策略按鍵,從任意一個分鍾數調到另外任意一個分鍾數最多要按多少次。
注意,按 +k 按鈕時,如果加k后數字超過n-1,則會對n取模。
比如,n=10, k=6 的時候,假設當前時間是0,連按2次 +k 按鈕,則調為2。

「輸入格式」
一行兩個整數 n, k ,意義如題。

「輸出格式」
一行一個整數
表示:按照最優策略按鍵,從一個時間調到另一個時間最多要按多少次。

「樣例輸入」
5 3

「樣例輸出」
2

「樣例解釋」
如果時間正確則按0次。否則要按的次數和操作系列之間的關系如下:
1:+1
2:+1, +1
3:+3
4:+3, +1

「數據范圍」
對於 30% 的數據 0 < k < n <= 5
對於 60% 的數據 0 < k < n <= 100
對於 100% 的數據 0 < k < n <= 100000

 
 

5.搭積木

小明對搭積木非常感興趣。他的積木都是同樣大小的正立方體。
在搭積木時,小明選取 m 塊積木作為地基,將他們在桌子上一字排開,中間不留空隙,並稱其為第0層。
隨后,小明可以在上面擺放第1層,第2層,……,最多擺放至第n層。擺放積木必須遵循三條規則:

規則1:每塊積木必須緊挨着放置在某一塊積木的正上方,與其下一層的積木對齊;
規則2:同一層中的積木必須連續擺放,中間不能留有空隙;
規則3:小明不喜歡的位置不能放置積木。

其中,小明不喜歡的位置都被標在了圖紙上。圖紙共有n行,從下至上的每一行分別對應積木的第1層至第n層。每一行都有m個字符,字符可能是‘.’或‘X’,其中‘X’表示這個位置是小明不喜歡的。
現在,小明想要知道,共有多少種放置積木的方案。他找到了參加藍橋杯的你來幫他計算這個答案。
由於這個答案可能很大,你只需要回答這個答案對1000000007(十億零七)取模后的結果。
注意:地基上什么都不放,也算作是方案之一種。

【輸入格式】
輸入數據的第一行有兩個正整數n和m,表示圖紙的大小。
隨后n行,每行有m個字符,用來描述圖紙 。每個字符只可能是‘.’或‘X’。

【輸出格式】
輸出一個整數,表示答案對1000000007取模后的結果。

【樣例輸入1】
2 3
..X
.X.

【樣例輸出1】
4

【樣例說明1】
成功的擺放有(其中O表示放置積木):
(1)
..X
.X.
(2)
..X
OX.
(3)
O.X
OX.
(4)
..X
.XO

【樣例輸入2】
3 3
..X
.X.
...

【樣例輸出2】
16

【數據規模約定】
對於10%的數據,n=1,m<=30;
對於40%的數據,n<=10,m<=30;
對於100%的數據,n<=100,m<=100。

 
 

6.矩陣求和

經過重重筆試面試的考驗,小明成功進入 Macrohard 公司工作。
今天小明的任務是填滿這么一張表:
表有 n 行 n 列,行和列的編號都從1算起。
其中第 i 行第 j 個元素的值是 gcd(i, j)的平方,
gcd 表示最大公約數,以下是這個表的前四行的前四列:
1  1  1  1
1  4  1  4
1  1  9  1
1  4  1 16

小明突然冒出一個奇怪的想法,他想知道這張表中所有元素的和。
由於表過於龐大,他希望借助計算機的力量。

「輸入格式」
一行一個正整數 n 意義見題。

「輸出格式」
一行一個數,表示所有元素的和。由於答案比較大,請輸出模 (10^9 + 7)(即:十億零七) 后的結果。

「樣例輸入」
4

「樣例輸出」
48

「數據范圍」
對於 30% 的數據,n <= 1000
存在 10% 的數據,n = 10^5
對於 60% 的數據,n <= 10^6
對於 100% 的數據,n <= 10^7

 
 

點擊查看2018年藍橋杯B組C/C++決賽題目題解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM