藍橋杯題型簡介:
5個填空題,直接輸出結果即可,無需其他輸入輸出 否則算錯,只有滿分和0分之分
5個編程題,需要輸入測試數據,根據通過的樣例數來評分
填空題:
1.第幾天
直接手算輸出就完了,小學題。 125
2.明碼
將所給數字轉換成八位二進制數,然後根據格式輸出,可以得到真正的問題 “九的九次方等於多少?”,然後編程求解即可
需要注意 負數轉換成二進制的方法 還需要補位 代碼裏使用的 bitset函數,比較簡單省事 滿分Code
3.乘積尾零
類似於以前做過的階乘尾零問題,直接求100個數可以哦分解出多少個2和多少個5即可,當然結果就是二者裏面嬌小的那一個
4.測試次數
一個區間dp問題,第一想法是二分,但是不會寫 滿分Code
dp[i][j]表示 還有i部手機j層需要測試的樓層所需要的最多測試次數
轉移方程:dp[i][j]=min(dp[i][j],max(dp[i][j-k],dp[i-1][k-1])+1);// 沒摔壞在k層以上,摔壞了在k層以下
5.快速排序
以下代碼可以從數組a[]中找出第k小的元素。
####它使用了類似快速排序中的分治算法,期望時間複雜度是O(N)的。
####請仔細閱讀分析源碼,填寫劃線部分缺失的內容。
####只填寫劃線部分缺少的代碼,不要抄寫已經存在的代碼或符號。
#include <stdio.h>
int quick_select(int a[], int l, int r, int k) {
int p = rand() % (r - l + 1) + l;
int x = a[p];
{int t = a[p]; a[p] = a[r]; a[r] = t;}
int i = l, j = r;
while(i < j) {
while(i < j && a[i] < x) i++;
if(i < j) {
a[j] = a[i];
j--;
}
while(i < j && a[j] > x) j--;
if(i < j) {
a[i] = a[j];
i++;
}
}
a[i] = x;
p = i;
if(i - l + 1 == k) return a[i];
if(i - l + 1 < k) return quick_select( _____________________________ ); //填空
else return quick_select(a, l, i - 1, k);
}
int main()
{
int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
printf("%d\n", quick_select(a, 0, 14, 5));
return 0;
}
答案: a, i+1, r, k-(i-l+1)## 據說是對的
6.遞增三元組
需要隨機組合,而不是固定位置的比較,暴力應該過不去
以 b[i] 爲參照 求a[ ]裏比 b[i] 小的元素數和c[ ]裏比 b[i] 大的元素數 二者求積
先用sort排序,再用lower_bound函數和upper_bound去找位置 滿分Code
7.螺旋折線
數學思維題,將圖形分成四個部分,求出y軸上點的距離dy,dx,然後根據橫座標爲基準旋轉,就可以推導出公式,就是有點繞
8.日誌統計
使用二維數組,將每一個id被點讚的時間進行排序,然後尺取,判斷有沒有在規定時間內獲得足夠的贊 滿分Code
9.全球變暖
類似於hdu1241上的石油井那個dfs求連通塊,先求沒有淹沒時的連通塊個數,然後將臨近海洋的陸地淹沒,再求一下連通塊的數量,但是爲什麼只拿了38分呢???求救 38分Code
10.乘積最大
一個貪心的策略,按照絕對值的大小進行排序,分情況討論,非常的饒人 滿分Code
1、全部都選{
1、有零 ==0
2、奇數個負數 ==直接乘 取反
3、偶數個負數 ==直接乘
}
2、選一部分{
1、選的全是正數 ==直接乘
2、全是負數{
1、奇數個負數 ==直接乘 取反
2、偶數個負數 ==直接乘
}
3、正負和零都有{
1、有零 ==0
2、偶數個負數 ==直接乘
3、沒有零 奇數個負數{
1、剩餘的全是0 ==0
2、max(用絕對值最小的負數換後面最大的正數,用最小的正數換後面絕對值最大的負數)
}
}
}