南昌專業(yè)網(wǎng)站建設(shè)百度熱搜廣告設(shè)計(jì)公司
前言:
第一次做藍(lán)橋模擬賽的博客記錄,可能有很多不足的地方,現(xiàn)在將第十五屆藍(lán)橋杯模擬賽B組(第二期)的題目與代碼與大家進(jìn)行分享,我是用C++做的,有好幾道算法題當(dāng)時(shí)自己做的也是一臉懵,所以有好個(gè)別幾道也是請(qǐng)教了其他大佬才分享出來(lái)的。
目錄
?編輯
一、試題A
二、試題B
三、試題C
四、試題D
五、試題E
六、試題F
?七、試題G
八、試題H?
九、試題?I
十、試題?J
?
一、試題A
問(wèn)題描述
????????小藍(lán)要在屏幕上放置一行文字,每個(gè)字的寬度相同。
????????小藍(lán)發(fā)現(xiàn),如果每個(gè)字的寬為 36 像素,一行正好放下 30 個(gè)字,字符之間和前后都沒(méi)有任何 空隙。
????????請(qǐng)問(wèn),如果每個(gè)字寬為 10 像素,字符之間不包含空隙,一行可以放下多少個(gè)字??
沒(méi)啥好說(shuō)的,這就是一個(gè)小學(xué)數(shù)學(xué)題,36 ×30 / 10 =108
答案:108
二、試題B
問(wèn)題描述
????????求 2^2023%1000,即 2的2023次方除以1000的余數(shù)。
%1000就是要求?2^2023后三位,因?yàn)橹皇且粋€(gè)填空題,所有我們直接用計(jì)算器就可以求出來(lái)
?答案:608
三、試題C
問(wèn)題描述
????????如果一個(gè)正整數(shù)轉(zhuǎn)化成二進(jìn)制與轉(zhuǎn)換成八進(jìn)制后所有數(shù)位的數(shù)字之和相等,則稱為數(shù)位和相等 的數(shù)。
????????前幾個(gè)數(shù)位和相等的正整數(shù)為 1, 8, 9, 64, ……
????????請(qǐng)問(wèn)第 23 個(gè)數(shù)位和相等的正整數(shù)是多少??
?可以使用暴力或者寫程序的方法進(jìn)行求解
#include<bits/stdc++.h>#define num first
#define y secondusing namespace std;typedef long long ll;
typedef unsigned long long ULL;
typedef pair<int,int> PII;// 十進(jìn)制數(shù)轉(zhuǎn)換為任意n進(jìn)制數(shù)
// num:十進(jìn)制數(shù),n:轉(zhuǎn)換成n進(jìn)制數(shù)string Itoa(int num,int n)
{string str;int rem;char ch;if(num == 0)str = "0";while(num > 0) {rem = num % n;ch = (rem < 10) ? (rem + '0') : (rem - 10 + 'A');str = ch + str;num /= n;}return str;
}
// 計(jì)算每一位上的和
int sum(string str)
{int sum = 0;for(int i = 0;i < str.length();i ++) {sum += str[i] - '0';}return sum;
}
string str1;
string str2;
int main()
{int cnt = 0;int i = 1;while(1) {str1 = Itoa(i,2);str2 = Itoa(i,8);// cout<<i<<' '<<str1<<' '<<str2<<endl;if(sum(str1) == sum(str2)) {cnt ++;cout << "數(shù)字為" << i << endl;cout << str1 << endl;cout << str2 << endl;cout << "cnt的值是" << cnt << endl;}if(cnt == 23) {cout << "找到了!!!:>" << i << endl;cout << str1 << endl;cout << str2 << endl;break;}i ++;}
return 0;
}
數(shù)字為1 1 1 cnt的值是1 數(shù)字為8 1000 10 cnt的值是2 數(shù)字為9 1001 11 cnt的值是3 數(shù)字為64 1000000 100 cnt的值是4 數(shù)字為65 1000001 101 cnt的值是5 數(shù)字為72 1001000 110 cnt的值是6 數(shù)字為73 1001001 111 cnt的值是7 數(shù)字為512 1000000000 1000 cnt的值是8 數(shù)字為513 1000000001 1001 cnt的值是9 數(shù)字為520 1000001000 1010 cnt的值是10 數(shù)字為521 1000001001 1011 cnt的值是11 數(shù)字為576 1001000000 1100 cnt的值是12 數(shù)字為577 1001000001 1101 cnt的值是13 數(shù)字為584 1001001000 1110 cnt的值是14 數(shù)字為585 1001001001 1111 cnt的值是15 數(shù)字為4096 1000000000000 10000 cnt的值是16 數(shù)字為4097 1000000000001 10001 cnt的值是17 數(shù)字為4104 1000000001000 10010 cnt的值是18 數(shù)字為4105 1000000001001 10011 cnt的值是19 數(shù)字為4160 1000001000000 10100 cnt的值是20 數(shù)字為4161 1000001000001 10101 cnt的值是21 數(shù)字為4168 1000001001000 10110 cnt的值是22 數(shù)字為4169 1000001001001 10111 cnt的值是23 找到了!!!:>4169 1000001001001 10111
答案: 4169
四、試題D
問(wèn)題描述
????????對(duì)于以下這些數(shù)(6行,每行6個(gè),共36個(gè)),請(qǐng)問(wèn)約數(shù)個(gè)數(shù)最多的是哪個(gè)?(如果有多個(gè), 請(qǐng)回答出現(xiàn)最早的那個(gè))
????????393353 901440 123481 850930 423154 240461
????????373746 232926 396677 486579 744860 468782
????????941389 777714 992588 343292 385198 876426
????????483857 241899 544851 647930 772403 109929
????????882745 372491 877710 340000 659788 658675
????????296521 491295 609764 718967 842000 670302
約數(shù)個(gè)數(shù)模版題?
#include<bits/stdc++.h>using namespace std;const int N = 100010;int primes[N], cnt;
bool st[N];void init(int n)
{for (int i = 2; i <= n; i ++){if (!st[i]) primes[cnt ++] = i;for (int j = 0; primes[j] * i <= n; j ++){st[primes[j] * i] = true;if (i % primes[j] == 0) break;}}
}void divide(int x)
{int res = 0;for (int i = 0; i < cnt; i ++){int p = primes[i];if (x % p == 0){while (x % p == 0){res ++;{x /= p;}}}}cout << res << endl;
}int main()
{init(N);int m = 30;while (m--){int x;cin >> x;divide(x);}return 0;
}
答案: 901440
五、試題E
問(wèn)題描述
????????小藍(lán)有一個(gè)01矩陣。他打算將第一行第一列的 0 變?yōu)?2 。變化過(guò)程有傳染性,每次 2 的上下 左右四個(gè)相鄰的位置中的 0 都會(huì)變成 2 。直到最后每個(gè) 2 的周圍都是 1 或 2 結(jié)束。 請(qǐng)問(wèn),最終矩陣中有多少個(gè) 2 ?
????????以下是小藍(lán)的矩陣,共 30 行 40 列。 0000100010000001101010101001001100000011 0101111001111101110111100000101010011111 1000010000011101010110000000001011010100 0110101010110000000101100100000101001001 0000011010100000111111001101100010101001 0110000110000000110100000000010010100011 0100110010000110000000100010000101110000 0010011010100110001111001101100110100010 1111000111101000001110010001001011101101 0011110100011000000001101001101110100001 0000000101011000010011111001010011011100 0000100000011001000100101000111011101100 0010110000001000001010100011000010100011 0110110000100011011010011010001101011011 0000100100000001010000101100000000000010 0011001000001000000010011001100101000110 1110101000011000000100011001001100111010 0000100100111000001101001000001010010001 0100010010000110100001100000110111110101 1000001001100010011001111101011001110001 0000000010100101000000111100110010101101 0010110101001100000100000010000010110011 0000011101001001000111011000100111010100 0010001100100000011000101011000000010101 1001111010010110011010101110000000101110 0110011101000010100001000101001001100010 1101000000010010011001000100110010000101 1001100010100010000100000101111111111100 1001011010101100001000000011000110110000 0011000100011000010111101000101110110001
?經(jīng)典BFS(廣度優(yōu)先搜索)求聯(lián)通塊,由題意可知要求所有0的聯(lián)通塊中0的個(gè)數(shù)
#include<bits/stdc++.h>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;
const int N = 45;
char g[N][N];
bool st[N][N];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
int ans;void bfs(int x, int y)
{queue<PII> q;st[x][y] = true;q.push({x, y});ans++;while (q.size()){auto t = q.front();q.pop();for (int i = 0; i < 4; i++){int a = dx[i] + t.x, b = dy[i] + t.y;if (a < 0 || a >= 30 || b < 0 || b >= 40) continue;if (st[a][b]) continue;if (g[a][b] != '0') continue;ans++;st[a][b] = true;q.push({a, b});}}
}
int main()
{for (int i = 0; i < 30; i++) cin >> g[i];bfs(0, 0);cout << ans << endl;return 0;
}
答案:541?
六、試題F
問(wèn)題描述
????????給定一個(gè)正好六位的正整數(shù) x,請(qǐng)將 x 循環(huán)左移一位后輸出。
????????所謂循環(huán)左移一位,是指將原來(lái)的十萬(wàn)位變?yōu)閭€(gè)位,原來(lái)的萬(wàn)位到個(gè)位向左移動(dòng)依次變?yōu)槭f(wàn) 位到十位。
????????例如:194910 左移一位變?yōu)?949101 。
? ? ? ? 又如:987123 左移一位變?yōu)?871239 。
輸入格式
????????輸入一行包含一個(gè)整數(shù) x 。保證輸入的 x 正好包含 6 個(gè)十進(jìn)制數(shù)位,而且十萬(wàn)位和萬(wàn)位上的數(shù) 字均不為 0 。
輸出格式
????????輸出一行包含一個(gè)整數(shù),表示答案。 樣例輸入 194910 樣例輸出 949101
?直接字符串,簡(jiǎn)單模擬即可,我只能說(shuō)這道題就是一道經(jīng)典送分題,如果這都做不出來(lái)的話那就是真白學(xué)了
#include <bits/stdc++.h>using namespace std;int main()
{string s;cin >> s;for(int i = 1; i < s.size(); i ++)cout << s[i];cout << s[1];return 0;
}
?七、試題G
問(wèn)題描述
????????輸入一個(gè)僅包含小寫英文字母的字符串,請(qǐng)問(wèn)這個(gè)字符串中的最后一元音是什么。
????????在英文中,a, e, i, o, u 共 5 個(gè)字母是元音字母,其它字母不是元音字母。
輸入格式
????????輸入一行包含一個(gè)字符串,僅由小寫英文字符組成,字符串中至少包含一個(gè)元音字母
輸出格式
????????輸出一行包含一個(gè)字符,表示答案。
樣例輸入
????????lanqiao
樣例輸出
????????o
樣例輸入
????????cup
樣例輸出
????????u
這道題應(yīng)該和上一道題的難度不相上下吧,就是一個(gè)簡(jiǎn)單的循環(huán)遍歷字符串模擬,從后往前輸出第一個(gè)元音字母即可
#include <bits/stdc++.h>using namespace std;int main()
{string s;cin >> s;for(int i = s.size() - 1; i >= 0; i--){if(s[i] == 'a' || s[i] == 'o' || s[i] == 'e' || s[i] == 'i' || s[i] == 'u'){cout << s[i] << endl;break;}}return 0;
}
八、試題H?
問(wèn)題描述
????????給定一個(gè)整數(shù),對(duì)這個(gè)整數(shù)的一次轉(zhuǎn)換是指將這個(gè)整數(shù)變?yōu)檫@個(gè)整數(shù)的所有數(shù)位上的非零數(shù)字的乘積。
????????例如,對(duì) 123456789 進(jìn)行一次轉(zhuǎn)換變?yōu)?123456789=362880,再進(jìn)行一次轉(zhuǎn)換變?yōu)?36288=2304,再進(jìn)行一次轉(zhuǎn)換變?yōu)?234=24,再進(jìn)行一次轉(zhuǎn)換變?yōu)?8。
????????給定一個(gè)整數(shù),請(qǐng)依次將轉(zhuǎn)換過(guò)程中經(jīng)歷的每個(gè)整數(shù)輸出,直到小于 10 。
輸入格式
????????輸入一行包含一個(gè)整數(shù) n 。
輸出格式
????????輸出多行,每行包含一個(gè)整數(shù)。
樣例輸入
????????123456789
樣例輸出
????????362880
????????2304
????????24
????????8
評(píng)測(cè)用例規(guī)模與約定
????????對(duì)于 50% 的評(píng)測(cè)用例,1 <= n <= 10^9 (10的9次方)。
????????對(duì)于所有評(píng)測(cè)用例,1 <= n <= 10^18 (10的18次方)。
?簡(jiǎn)單模擬即可
#include <bits/stdc++.h>using namespace std;int main()
{long long int n;cin >> n;long long int sum = 11; while(sum >= 10){sum = 1;while(n){if((n % 10) != 0)sum *= n % 10;n /= 10;}cout << sum << " "<< endl;n = sum; }return 0;
}
九、試題?I
問(wèn)題描述
????????小藍(lán)站在一個(gè) n 行 m 列的方格圖中間,方格圖的每一個(gè)方格上都標(biāo)有一個(gè)正整數(shù)。 ????如果兩個(gè)相鄰方格(上下左右四個(gè)方向相鄰)內(nèi)的數(shù)的最大公約數(shù)大于 1 ,則可以從其中一個(gè) 方格移動(dòng)到另一個(gè)方格,當(dāng)然也可以從另一個(gè)方格移回第一個(gè)方格。
????????假設(shè)小藍(lán)開(kāi)始時(shí)站在第 r 行第 c 列,請(qǐng)問(wèn)小藍(lán)可以移動(dòng)到方格圖內(nèi)的多少個(gè)方格?
輸入格式
????????輸入的第一行包含兩個(gè)整數(shù) n, m ,用一個(gè)空格分隔,表示方格圖的行數(shù)和列數(shù)。 接下來(lái) n 行,每行包含 m 個(gè)正整數(shù),相鄰整數(shù)間用一個(gè)空格分隔,依次表示方格圖中從第 1 行到第 n 行,每行從第 1 列到第 m 列中的數(shù)。
????????接下來(lái)一行包含兩個(gè)整數(shù) r, c,用一個(gè)空格分隔,表示小藍(lán)所在的行號(hào)和列號(hào)。
輸出格式
????????輸出一行包含一個(gè)整數(shù),表示答案。
樣例輸入?
3 4
3 6 5 5
2 4 3 5
7 8 3 8
3 2
樣例輸出 5
評(píng)測(cè)用例規(guī)模與約定
????????對(duì)于50%的評(píng)測(cè)用例,1 <= n, m <= 100,方格圖中的每個(gè)數(shù)不超過(guò) 10^5 (10的5次方)。
????????對(duì)于所有評(píng)測(cè)用例,1 <= n, m <= 1000,方格圖中的每個(gè)數(shù)不超過(guò) 10^9 (10的9次方)。
BFS模版題,就是加了求最大公約數(shù)的步驟?
#include<bits/stdc++.h>#define x first
#define y secondusing namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int g[N][N];
int n, m;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
int ans;
bool st[N][N];int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}
void bfs(int x, int y)
{queue<PII> q;st[x][y] = true;q.push({x, y});ans++;while (q.size()){auto t = q.front();q.pop();for (int i = 0; i < 4; i++){int a = dx[i] + t.x, b = dy[i] + t.y;if (a < 1 || a > n || b < 1 || b > m) continue;if (st[a][b]) continue;if (gcd(g[a][b], g[t.x][t.y]) <= 1) continue;st[a][b] = true;ans ++;q.push({a, b});}}
}
int main()
{cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> g[i][j];int x, y;cin >> x >> y;bfs(x, y);cout << ans << endl;return 0;
}
?
十、試題?J
問(wèn)題描述
????????給定一個(gè)序列 a[1], a[2], …, a[n] 和一個(gè)整數(shù) k,請(qǐng)找出一個(gè)長(zhǎng)度正好為 k 的區(qū)間,使得區(qū)間中 所有數(shù)的和最大。
????????即要找到一個(gè)整數(shù) p ,使得 1 <= p 且 p+k-1 <= n ,使得 a[p]+a[p+1]+...+a[p+k-1] 最大。
輸入格式
????????輸入的第一行包含兩個(gè)整數(shù) n , k。
????????第二行包含 n 個(gè)整數(shù),相鄰的整數(shù)之間使用一個(gè)空格分隔,表示給定的序列。
輸出格式
????????輸出一行包含一個(gè)整數(shù),表示最大的區(qū)間和,你只需要輸出和就行,不需要輸出方案。 樣例輸入
???????? 6 3 2 3 9 1 9 5
樣例輸出
????????19
評(píng)測(cè)用例規(guī)模與約定
????????對(duì)于 30% 的評(píng)測(cè)用例,1 <= k <= n <= 30,1 <= a[i] <= 100。
????????對(duì)于 60% 的評(píng)測(cè)用例,1 <= k <= n <= 1000,1 <= a[i] <= 10000。
????????對(duì)于所有評(píng)測(cè)用例,1 <= k <= n <= 100000,1 <= a[i] <= 1000000。
?這個(gè)就是一個(gè)簡(jiǎn)單的滑動(dòng)窗口,前綴和模版題,有一點(diǎn)需要注意,那就是開(kāi)long long,要不然會(huì)超出范圍
#include <bits/stdc++.h>using namespace std;int main()
{int n,k;cin >> n >> k;long long int s[100000];for(int i = 1; i <= n; i ++){cin >> s[i];s[i] += s[i - 1];}long long int m;for(int i = 1; i + k - 1 <= n; i ++){m = max(s[i + k - 1] - s[i - 1],m);}cout << m << endl;return 0;
}