南昌專業(yè)網(wǎng)站建設百度熱搜廣告設計公司
前言:
第一次做藍橋模擬賽的博客記錄,可能有很多不足的地方,現(xiàn)在將第十五屆藍橋杯模擬賽B組(第二期)的題目與代碼與大家進行分享,我是用C++做的,有好幾道算法題當時自己做的也是一臉懵,所以有好個別幾道也是請教了其他大佬才分享出來的。
目錄
?編輯
一、試題A
二、試題B
三、試題C
四、試題D
五、試題E
六、試題F
?七、試題G
八、試題H?
九、試題?I
十、試題?J
?
一、試題A
問題描述
????????小藍要在屏幕上放置一行文字,每個字的寬度相同。
????????小藍發(fā)現(xiàn),如果每個字的寬為 36 像素,一行正好放下 30 個字,字符之間和前后都沒有任何 空隙。
????????請問,如果每個字寬為 10 像素,字符之間不包含空隙,一行可以放下多少個字??
沒啥好說的,這就是一個小學數(shù)學題,36 ×30 / 10 =108
答案:108
二、試題B
問題描述
????????求 2^2023%1000,即 2的2023次方除以1000的余數(shù)。
%1000就是要求?2^2023后三位,因為只是一個填空題,所有我們直接用計算器就可以求出來
?答案:608
三、試題C
問題描述
????????如果一個正整數(shù)轉化成二進制與轉換成八進制后所有數(shù)位的數(shù)字之和相等,則稱為數(shù)位和相等 的數(shù)。
????????前幾個數(shù)位和相等的正整數(shù)為 1, 8, 9, 64, ……
????????請問第 23 個數(shù)位和相等的正整數(shù)是多少??
?可以使用暴力或者寫程序的方法進行求解
#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;// 十進制數(shù)轉換為任意n進制數(shù)
// num:十進制數(shù),n:轉換成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;
}
// 計算每一位上的和
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
問題描述
????????對于以下這些數(shù)(6行,每行6個,共36個),請問約數(shù)個數(shù)最多的是哪個?(如果有多個, 請回答出現(xiàn)最早的那個)
????????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ù)個數(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
問題描述
????????小藍有一個01矩陣。他打算將第一行第一列的 0 變?yōu)?2 。變化過程有傳染性,每次 2 的上下 左右四個相鄰的位置中的 0 都會變成 2 。直到最后每個 2 的周圍都是 1 或 2 結束。 請問,最終矩陣中有多少個 2 ?
????????以下是小藍的矩陣,共 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的個數(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
問題描述
????????給定一個正好六位的正整數(shù) x,請將 x 循環(huán)左移一位后輸出。
????????所謂循環(huán)左移一位,是指將原來的十萬位變?yōu)閭€位,原來的萬位到個位向左移動依次變?yōu)槭f 位到十位。
????????例如:194910 左移一位變?yōu)?949101 。
? ? ? ? 又如:987123 左移一位變?yōu)?871239 。
輸入格式
????????輸入一行包含一個整數(shù) x 。保證輸入的 x 正好包含 6 個十進制數(shù)位,而且十萬位和萬位上的數(shù) 字均不為 0 。
輸出格式
????????輸出一行包含一個整數(shù),表示答案。 樣例輸入 194910 樣例輸出 949101
?直接字符串,簡單模擬即可,我只能說這道題就是一道經(jīng)典送分題,如果這都做不出來的話那就是真白學了
#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
問題描述
????????輸入一個僅包含小寫英文字母的字符串,請問這個字符串中的最后一元音是什么。
????????在英文中,a, e, i, o, u 共 5 個字母是元音字母,其它字母不是元音字母。
輸入格式
????????輸入一行包含一個字符串,僅由小寫英文字符組成,字符串中至少包含一個元音字母
輸出格式
????????輸出一行包含一個字符,表示答案。
樣例輸入
????????lanqiao
樣例輸出
????????o
樣例輸入
????????cup
樣例輸出
????????u
這道題應該和上一道題的難度不相上下吧,就是一個簡單的循環(huán)遍歷字符串模擬,從后往前輸出第一個元音字母即可
#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?
問題描述
????????給定一個整數(shù),對這個整數(shù)的一次轉換是指將這個整數(shù)變?yōu)檫@個整數(shù)的所有數(shù)位上的非零數(shù)字的乘積。
????????例如,對 123456789 進行一次轉換變?yōu)?123456789=362880,再進行一次轉換變?yōu)?36288=2304,再進行一次轉換變?yōu)?234=24,再進行一次轉換變?yōu)?8。
????????給定一個整數(shù),請依次將轉換過程中經(jīng)歷的每個整數(shù)輸出,直到小于 10 。
輸入格式
????????輸入一行包含一個整數(shù) n 。
輸出格式
????????輸出多行,每行包含一個整數(shù)。
樣例輸入
????????123456789
樣例輸出
????????362880
????????2304
????????24
????????8
評測用例規(guī)模與約定
????????對于 50% 的評測用例,1 <= n <= 10^9 (10的9次方)。
????????對于所有評測用例,1 <= n <= 10^18 (10的18次方)。
?簡單模擬即可
#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
問題描述
????????小藍站在一個 n 行 m 列的方格圖中間,方格圖的每一個方格上都標有一個正整數(shù)。 ????如果兩個相鄰方格(上下左右四個方向相鄰)內的數(shù)的最大公約數(shù)大于 1 ,則可以從其中一個 方格移動到另一個方格,當然也可以從另一個方格移回第一個方格。
????????假設小藍開始時站在第 r 行第 c 列,請問小藍可以移動到方格圖內的多少個方格?
輸入格式
????????輸入的第一行包含兩個整數(shù) n, m ,用一個空格分隔,表示方格圖的行數(shù)和列數(shù)。 接下來 n 行,每行包含 m 個正整數(shù),相鄰整數(shù)間用一個空格分隔,依次表示方格圖中從第 1 行到第 n 行,每行從第 1 列到第 m 列中的數(shù)。
????????接下來一行包含兩個整數(shù) r, c,用一個空格分隔,表示小藍所在的行號和列號。
輸出格式
????????輸出一行包含一個整數(shù),表示答案。
樣例輸入?
3 4
3 6 5 5
2 4 3 5
7 8 3 8
3 2
樣例輸出 5
評測用例規(guī)模與約定
????????對于50%的評測用例,1 <= n, m <= 100,方格圖中的每個數(shù)不超過 10^5 (10的5次方)。
????????對于所有評測用例,1 <= n, m <= 1000,方格圖中的每個數(shù)不超過 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
問題描述
????????給定一個序列 a[1], a[2], …, a[n] 和一個整數(shù) k,請找出一個長度正好為 k 的區(qū)間,使得區(qū)間中 所有數(shù)的和最大。
????????即要找到一個整數(shù) p ,使得 1 <= p 且 p+k-1 <= n ,使得 a[p]+a[p+1]+...+a[p+k-1] 最大。
輸入格式
????????輸入的第一行包含兩個整數(shù) n , k。
????????第二行包含 n 個整數(shù),相鄰的整數(shù)之間使用一個空格分隔,表示給定的序列。
輸出格式
????????輸出一行包含一個整數(shù),表示最大的區(qū)間和,你只需要輸出和就行,不需要輸出方案。 樣例輸入
???????? 6 3 2 3 9 1 9 5
樣例輸出
????????19
評測用例規(guī)模與約定
????????對于 30% 的評測用例,1 <= k <= n <= 30,1 <= a[i] <= 100。
????????對于 60% 的評測用例,1 <= k <= n <= 1000,1 <= a[i] <= 10000。
????????對于所有評測用例,1 <= k <= n <= 100000,1 <= a[i] <= 1000000。
?這個就是一個簡單的滑動窗口,前綴和模版題,有一點需要注意,那就是開long long,要不然會超出范圍
#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;
}