2017【第八屆藍橋杯初賽】 C/C++ B組

第八屆藍橋杯題型簡介:

6個填空題,直接輸出結果即可,無需其他輸入輸出 否則算錯,只有滿分和0分之分 

4個編程題,需要輸入測試數據,根據通過的樣例數來評分 

填空題:

1.購物單

這個題是真的暴力,那麼多數據一個個輸入就麻煩了,還可能出錯,使用編輯器的快速替換處理一下改爲一個輸入的求解的問題就OK了                                               ans=5200

2.等差素數列

炒雞暴力的枚舉,先把素數全部篩出來(直接判斷也行),枚舉一下公差,再枚舉首項,判斷一下能否連續10個都符合條件,找到最後結果                                        ans=210  +code

3.承壓計算

一看那麼多數據,肯定又是暴力,這是一個楊輝三角類似物,不同的是頭上的重量會均分給兩隻腳,一直傳達到最下面的30個電子秤

這道題涉及到一個公式的轉換  重量/示數=進制,一上來沒弄明白給那個數是啥意思。。。再就是輸出的時候使用printf找到double值,使用cout會自動使用科學計數法,最後的輸出是一個整數!!!                       ans=72665192664  +code

4.方格分割

這道題放在這裏真是難爲人,出題人太huai了,沒做出來,待更新。。。

5.取數位

求1個整數的第k位數字有很多種方法。
以下的方法就是一種。

求x用10進製表示時的數位長度 
int len(int x){
    if(x<10) return 1;
    return len(x/10)+1;
}    
// 取x的第k位數字
int f(int x, int k){
    if(len(x)-k==0) return x%10;
    return _____________________;  //填空
}   
int main()
{
    int x = 23574;
    printf("%d\n", f(x,3));
    return 0;
}
// 對於題目中的測試數據,應該打印5。
// 請仔細分析源碼,並補充劃線部分所缺少的代碼。
// 注意:只提交缺失的代碼,不要填寫任何已有內容或說明性的文字。

一個簡單的遞歸公式的遞推,每次截掉後面多餘的數位即可      ans : f(x/10,k)   

6.最大公共子串

標題:最大公共子串
最大公共子串長度問題就是:
求兩個串的所有子串中能夠匹配上的最大長度是多少。
比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最長的公共子串是"abcd",所以最大公共子串長度爲4。
下面的程序是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法
請分析該解法的思路,並補全劃線部分缺失的代碼。

#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2)
{
	int a[N][N];
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	int i,j;
	memset(a,0,sizeof(int)*N*N);
	int max = 0;
	for(i=1; i<=len1; i++)
		for(j=1; j<=len2; j++)
			if(s1[i-1]==s2[j-1]) {
				a[i][j] = __________________________;  //填空
				if(a[i][j] > max) max = a[i][j];
			}
	return max;
}
 
int main()
{
	printf("%d\n", f("abcdkkk", "baabcdadabc"));
	return 0;
}

看清楚了,這是子串,不是子序列。。談不上是一個動態規劃問題,就當是直接暴力吧  ans:a[i-1][j-1]+1

編程題:

7.日期問題

題目不是很難,但是非常的麻煩,首先枚舉一下可能成功的三種情況,枚舉的過程中不要忘了判斷閏年,然後輸出的順序還要按照時間從先到後,需要輸出的格式也不要忘了。。。

提供兩組測試數據                        滿分code

01/01/01
00/02/29

8.包子湊數

訓練系統裏面有一個題是 給你兩個數,求最大湊不成的數,這個是求湊不成的數的個數,但是這個數據是多個,求法很類似。

題目中要求可能有無數個湊不出來的數,什麼意思呢?其實這裏就需要保證 這些數必須互質(不是兩兩互質。。)所有數的最大公約數gcd 需要等於1,因爲不是gcd的倍數都湊不出來(裴蜀定理:對於整數a,b,他們關於x,y的線性不定方程ax+by=d,設gcd(a,b)=g,則可證明g|d,換句話說,就是g是a,b的最小線性組合

剩下就是一個遞推,也有人說是個完全揹包。。。用個數組標記可否湊成                 滿分code

9.分巧克力

這就是一個分pie問題,使用二分直接錘就行,需要注意的一點就是因爲要分成正方形,一個矩形可以分成的正方形的個數可不是簡單的面積相除哦 ~~~                              滿分code

10.k倍區間

這道題有點意思,第一想法還是暴力,哈哈哈哈,但是鐵定過不了,也就是想想吧

既然是區間的和,還那麼多區間,自然就會想到 前綴和 嘍,但是隻用前綴和還是不夠的。我們知道區間 i~j 的區間和是 sum[j]-sum[i-1],看另一個公式 (a-b)%k==0  <->  a%k-b%k==0  <->  a%k=b%k,這就說明了如果區間和模k==0只需要使得區間兩端的sum模k相等即可,由於求和是不影響取模運算的,所以我們可以使用  sum數組存前綴和對k取模的結果,  然後使用cnt數組記錄模k的所有的結果的個數,最後的結果就是cnt[0]+所有取模的結果的兩兩組合的數量(1+2+...+n-1)可以推一下      滿分code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章