2022年藍橋杯省賽B組題目解析(C/C++)
2022年藍橋杯省賽B組題目解析(C/C++)
oj:https://www.dotcpp.com/oj/train/1026/
試題 A: 九進位制轉十進位制
本題總分:5 分
【問題描述】
九進位制正整數 (2022)9 轉換成十進位制等於多少?
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。
本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
- 答案:1487
#include<cstdio>
int main(){
int n = 2022;
int a=0, base=1;
while(n){
a += n%10*base;
base *= 9;
n /= 10;
}
printf("%d\n", a);
return 0;
}
試題 B: 順子日期
本題總分:5 分
【問題描述】
小明特別喜歡順子。順子指的就是連續的三個數字:123、456 等。
順子日期指的就是在日期的 yyyymmdd 表示法中,存在任意連續的三位數是一個順子的日期。
例如 20220123 就是一個順子日期,因為它出現了一個順子:123;
而 20221023 則不是一個順子日期,它一個順子也沒有。小明想知道在整個 2022年份中,一共有多少個順子日期。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。
本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
- 答案:14
#include<cstdio> bool check(int num){ int temp=num, cnt=1, maxv=num%10; while(temp){ temp/=10; if(cnt==3) return 1; if(maxv-temp%10==1) maxv=temp%10, cnt++; else maxv=temp%10, cnt=1; } return 0; } int main(){ int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int year=2022,ans=0; if(year%400==0 || year%4==0&&year%100!=0) day[2]++; for(int m=1; m<=12; m++){ for(int d=1; d<=day[m]; d++){ int temp=year*10000+m*100+d; printf("%d\n", temp); if(check(temp)) { ans++; printf("------- ans = %d\n", ans);// 輸出檢視 } } } printf("%d\n", ans); return 0; }
試題 C: 刷題統計
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:10 分
【問題描述】
小明決定從下週一開始努力刷題準備藍橋杯競賽。
他計劃週一至週五每天做 a 道題目,週六和週日每天做 b 道題目。
請你幫小明計算,按照計劃他將在第幾天實現做題數大於等於 n 題?
【輸入格式】輸入一行包含三個整數 a, b 和 n.
【輸出格式】輸出一個整數代表天數。
【樣例輸入】10 20 99
【樣例輸出】8
【評測用例規模與約定】
對於 50% 的評測用例,1 ≤ a, b, n ≤ 1e7.
對於 100% 的評測用例,1 ≤ a, b, n ≤ 1e19.
- 資料較大注意範圍
#include<cstdio>
typedef long long ll;
ll test1(ll a,ll b,ll n){ // 列舉天數 50分
for(ll x=1; ; x++){
ll temp = x/7*5*a + x/7*2*b;
if(x%7<=5) temp += a*(x%7);
else temp += a*5+b*(x%7-5);
if(temp>=n) return x;
}
}
ll test2(ll a,ll b,ll n){ // 模擬 50分
ll ans=0, x=1;
while(n>0){
if(x>7) x=1;
if(x<=5) n-=a;
else if(x<=7) n-=b;
ans++, x++;
}
return ans;
}
ll test3(ll a,ll b,ll n){ // 正解
ll x = n/(5*a+2*b),ans=0; // 已完成周數
ll temp = n%(5*a+2*b); // 剩餘題數在一週內可完成
for(int i=1; i<=7; i++){
if(temp>0 && i<=5) temp-=a, ans++;
if(temp>0 && i>=6) temp-=b, ans++;
}
return x*7+ans;
}
int main(){
ll a,b,n,ans=1; scanf("%lld%lld%lld",&a,&b,&n);
printf("%lld\n", test3(a,b,n));
return 0;
}
試題 D: 修剪灌木
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:10 分
【問題描述】
愛麗絲要完成一項修剪灌木的工作。
有 N 棵灌木整齊的從左到右排成一排。愛麗絲在每天傍晚會修剪一棵灌木,讓灌木的高度變為 0 釐米。
愛麗絲修剪灌木的順序是從最左側的灌木開始,每天向右修剪一棵灌木。
當修剪了最右側的灌木後,她會調轉方向,下一天開始向左修剪灌木。
直到修剪了最左的灌木後再次調轉方向。然後如此迴圈往復。
灌木每天從早上到傍晚會長高 1 釐米,而其餘時間不會長高。
在第一天的早晨,所有灌木的高度都是 0 釐米。
愛麗絲想知道每棵灌木最高長到多高。
【輸入格式】一個正整數 N ,含義如題面所述。
【輸出格式】輸出 N 行,每行一個整數,第行表示從左到右第 i 棵樹最高能長到多高。
【樣例輸入】3
【樣例輸出】
4
2
4
【評測用例規模與約定】
對於 30% 的資料,N ≤ 10.
對於 100% 的資料,1 < N ≤ 10000.
試題 E: X 進位制減法
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:15 分
【問題描述】
進位制規定了數字在數位上逢幾進一。
X 進位制是一種很神奇的進位制,因為其每一數位的進位制並不固定!
例如說某種 X 進位制數,最低數位為二進位制,第二數位為十進位制,第三數位為八進位制,則X 進位制數 321 轉換為十進位制數為 65。
現在有兩個 X 進製表示的整數 A 和 B,但是其具體每一數位的進位制還不確定,只知道 A 和 B 是同一進位制規則,且每一數位最高為 N 進位制,最低為二進位制。請你算出 A ? B 的結果最小可能是多少。
請注意,你需要保證 A 和 B 在 X 進位制下都是合法的,即每一數位上的數字要小於其進位制。
【輸入格式】
第一行一個正整數 N,含義如題面所述。
第二行一個正整數 Ma,表示 X 進位制數 A 的位數。
第三行 Ma 個用空格分開的整數,表示 X 進位制數 A 按從高位到低位順序各個數位上的數字在十進位制下的表示。
第四行一個正整數 Mb,表示 X 進位制數 B 的位數。
第五行 Mb 個用空格分開的整數,表示 X 進位制數 B 按從高位到低位順序各個數位上的數字在十進位制下的表示。
請注意,輸入中的所有數字都是十進位制的。
【輸出格式】
輸出一行一個整數,表示 X 進位制數 A ? B 的結果的最小可能值轉換為十進位制後再模 1000000007 的結果。
【樣例輸入】
11
3
10 4 0
3
1 2 0
【樣例輸出】94
【樣例說明】
當進製為:最低位 2 進位制,第二數位 5 進位制,第三數位 11 進位制時,減法得到的差最小。
此時 A 在十進位制下是 108,B 在十進位制下是 14,差值是 94。
【評測用例規模與約定】
對於 30% 的資料,N ≤ 10; Ma, Mb ≤ 8.
對於 100% 的資料,2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.
試題 F: 統計子矩陣
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:15 分
【問題描述】
給定一個 N × M 的矩陣 A,請你統計有多少個子矩陣 (最小 1 × 1,最大N × M) 滿足子矩陣中所有數的和不超過給定的整數 K?
【輸入格式】第一行包含三個整數 N, M 和 K.之後 N 行每行包含 M 個整數,代表矩陣 A.
【輸出格式】一個整數代表答案。
【樣例輸入】
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
【樣例輸出】19
【樣例說明】
滿足條件的子矩陣一共有 19,包含:
大小為 1 × 1 的有 10 個。
大小為 1 × 2 的有 3 個。
大小為 1 × 3 的有 2 個。
大小為 1 × 4 的有 1 個。
大小為 2 × 1 的有 3 個。
【評測用例規模與約定】
對於 30% 的資料,N, M ≤ 20.
對於 70% 的資料,N, M ≤ 100.
對於 100% 的資料,1 ≤ N, M ≤ 500; 0 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000.
比賽時的思路時列舉每個起點,再對每個起點列舉終點,再對每種起點和終點的情況遍歷其中的值,可惜沒寫出來。
試題 G: 積木畫
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:20 分
【問題描述】
小明最近迷上了積木畫,有這麼兩種型別的積木,分別為 I 型(大小為 2個單位面積)和 L 型(大小為 3 個單位面積):
同時,小明有一塊麵積大小為 2 × N 的畫布,畫布由 2 × N 個 1 × 1 區域構成。
小明需要用以上兩種積木將畫布拼滿,他想知道總共有多少種不同的方式?
積木可以任意旋轉,且畫布的方向固定。
【輸入格式】輸入一個整數 N,表示畫布大小。
【輸出格式】輸出一個整數表示答案。由於答案可能很大,所以輸出其對 1000000007 取模後的值
【樣例輸入】3
【樣例輸出】5
試題 H: 掃雷
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:20 分
【問題描述】
小明最近迷上了一款名為《掃雷》的遊戲。
其中有一個關卡的任務如下,在一個二維平面上放置著 n 個炸雷,第 i 個炸雷 (xi, yi,ri) 表示在座標 (xi, yi) 處存在一個炸雷,它的爆炸範圍是以半徑為 ri 的一個圓。為了順利通過這片土地,需要玩家進行排雷。玩家可以發射 m 個排雷火箭,小明已經規劃好了每個排雷火箭的發射方向,第 j 個排雷火箭 (xj, yj, rj) 表示這個排雷火箭將會在(xj, yj) 處爆炸,它的爆炸範圍是以半徑為 rj 的一個圓,在其爆炸範圍內的炸雷會被引爆。同時,當炸雷被引爆時,在其爆炸範圍內的炸雷也會被引爆。現在小明想知道他這次共引爆了幾顆炸雷?你可以把炸雷和排雷火箭都視為平面上的一個點。一個點處可以存在多個炸雷和排雷火箭。當炸雷位於爆炸範圍的邊界上時也會被引爆。
【輸入格式】
輸入的第一行包含兩個整數 n、m.
接下來的 n 行,每行三個整數 xi, yi, ri,表示一個炸雷的資訊。
再接下來的 m 行,每行三個整數 xj, yj, rj,表示一個排雷火箭的資訊。
【輸出格式】輸出一個整數表示答案。
【樣例輸入】
2 1
2 2 4
4 4 2
0 0 5
【樣例輸出】2
試題 I: 李白打酒加強版
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:25 分
【問題描述】
話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒 2 鬥。他邊走邊唱:
無事街上走,提壺去打酒。
逢店加一倍,遇花喝一斗。
這一路上,他一共遇到店 N 次,遇到花 M 次。
已知最後一次遇到的是花,他正好把酒喝光了。
請你計算李白這一路遇到店和花的順序,有多少種不同的可能?
注意:壺裡沒酒 ( 0 鬥) 時遇店是合法的,加倍後還是沒酒;
但是沒酒時遇花是不合法的。
【輸入格式】第一行包含兩個整數 N 和 M.
【輸出格式】輸出一個整數表示答案。由於答案可能很大,輸出模 1000000007 的結果。
【樣例輸入】5 10
【樣例輸出】14
【評測用例規模與約定】
對於 40% 的評測用例:1 ≤ N, M ≤ 10。
對於 100% 的評測用例:1 ≤ N, M ≤ 100。
試題 J: 砍竹子
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:25 分
【問題描述】
這天,小明在砍竹子,他面前有 n 棵竹子排成一排,一開始第 i 棵竹子的高度為 hi.
他覺得一棵一棵砍太慢了,決定使用魔法來砍竹子。
魔法可以對連續的一段相同高度的竹子使用,假設這一段竹子的高度為 H,
那麼使用一次魔法可以把這一段竹子的高度都變為 sqrt( ⌊H/2⌋ + 1),其中 ⌊x⌋ 表示對 x 向下取整。
小明想知道他最少使用多少次魔法可以讓所有的竹子的高度都變為 1。
【輸入格式】
第一行為一個正整數 n,表示竹子的棵數。
第二行共 n 個空格分開的正整數 hi,表示每棵竹子的高度。
【輸出格式】一個整數表示答案。
【樣例輸入】
6
2 1 4 2 6 7
【樣例輸出】5