第八屆藍橋杯題型簡介:
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