一、1.單詞分析 - 藍橋云課


(模擬、枚舉)算法代碼:
#include <bits/stdc++.h>
using namespace std;int main()
{string s;cin>>s;unordered_map<char,int> mp;for(auto ch:s){mp[ch]++;}char result_char='z';int max_count=0;for(auto& entry:mp){if(entry.second>max_count){result_char=entry.first;max_count=entry.second;}else if (entry.second == max_count) {if (entry.first < result_char) {result_char = entry.first;}}}cout << result_char << endl;cout << max_count << endl;return 0;
}
?二、2.成績統計 - 藍橋云課


(模擬)算法代碼:?
#include <bits/stdc++.h>
using namespace std;int main()
{int n;cin>>n;int simple=0,good=0;for(int i=0;i<n;i++){int score=0;cin>>score;if(score>=60){simple++;if(score>=85){good++;}}}double pass_rate=(double)simple/n*100;double good_rate=(double)good/n*100;printf("%d%%",(int)round(pass_rate));cout<<endl;printf("%d%%",(int)round(good_rate));return 0;
}
三、3.門牌制作 - 藍橋云課

(模擬、枚舉)算法代碼:?
#include <bits/stdc++.h>
using namespace std;
int cnt;
int main()
{for(int i=1;i<=2020;i++){int tmp=i;while(tmp){if(tmp%10==2){cnt++;}tmp/=10;}}cout<<cnt<<endl;return 0;
}
四、4.數字三角形 - 藍橋云課


(DFS)算法代碼:(通過50%)?
#include<bits/stdc++.h>
using namespace std;int n;
vector<vector<int>> num;
int max_sum = 0;void dfs(int row, int col, int sum, int left_count, int right_count) {// 到達最后一行if (row == n - 1) {// 檢查左右移動次數差是否不超過1if (abs(left_count - right_count) <= 1) {max_sum = max(max_sum, sum);}return;}// 向左下移動dfs(row + 1, col, sum + num[row + 1][col], left_count + 1, right_count);// 向右下移動dfs(row + 1, col + 1, sum + num[row + 1][col + 1], left_count, right_count + 1);
}int main() {cin >> n;num.resize(n,vector<int>(n,0));// 讀取輸入for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {cin >> num[i][j];}}// 從頂點開始DFSdfs(0, 0, num[0][0], 0, 0);cout << max_sum << endl;return 0;
}
?(動態規劃)算法代碼:(通過30%)
#include<bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;vector<vector<int>> num(n, vector<int>(n, 0));for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {cin >> num[i][j];}}// 從倒數第二層開始向上動態規劃for (int i = n - 2; i >= 0; i--) {for (int j = 0; j <= i; j++) {num[i][j] += max(num[i + 1][j], num[i + 1][j + 1]);}}cout << num[0][0] << endl;return 0;
}
五、5.卡片 - 藍橋云課

(模擬、枚舉)算法代碼:?
#include <iostream>
using namespace std;int main()
{int i;int arr[10];for(i=0;i<10;i++){arr[i]=2021;//記錄0-9這10張卡片的數量,開始都是2021張}for(i=1;;i++){//由于不知道到i的邊界值,省略,會一直執行int x=i; //用x來存放每一個i的值,防止i值的改變while(x){if(arr[x%10]==0){//當有一張卡片的數量剩余為0張的時候,輸出前一個i的值,也就是i-1,并退出cout<<i-1;return 0;} arr[x%10]--; //每一張卡片數量減少1x/=10;}}return 0;
}
六、6.成績分析 - 藍橋云課


(模擬)算法代碼:?
#include <bits/stdc++.h>
using namespace std;
int sum;
vector<int> score;
int main()
{int n;cin>>n;score.resize(n,0);for(int i=0;i<n;i++){cin>>score[i];sum+=score[i];}sort(score.begin(),score.end());int the_lowest=score.front();int the_best=score.back();double average=(double)sum/n;average=round(average*100)/100;printf("%d\n",the_best);printf("%d\n",the_lowest);printf("%.2f\n",average);return 0;
}
七、7.空間 - 藍橋云課

(單位換算)算法代碼:?
#include <bits/stdc++.h>
using namespace std;
int main()
{cout<<(long long)256*1024*1024*8/32;cout<<1ll*256*1024*1024*8/32;return 0;
}
八、8.路徑之謎 - 藍橋云課


(DFS)算法代碼:?
#include <bits/stdc++.h>
using namespace std;int n;
vector<int> north; // 北墻靶子數字(自西向東)
vector<int> west; // 西墻靶子數字(自北向南)
vector<int> path; // 存儲當前路徑
vector<vector<bool>> visited; // 記錄已訪問的方格
vector<int> result; // 存儲最終結果// 方向數組:上、右、下、左
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};// 檢查當前位置是否有效
bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < n && !visited[x][y];
}// 檢查當前箭靶數字是否合法
bool isTargetValid() {for (int i = 0; i < n; i++) {if (north[i] < 0 || west[i] < 0) return false;}return true;
}// 檢查是否到達終點且所有箭靶數字恰好用完
bool isSolution() {if (path.back() != n * n - 1) return false; // 未到達東南角for (int i = 0; i < n; i++) {if (north[i] != 0 || west[i] != 0) return false;}return true;
}void dfs(int x, int y) {// 到達終點且滿足條件if (x == n - 1 && y == n - 1 && isSolution()) {result = path;return;}// 嘗試四個方向for (int i = 0; i < 4; i++) {int nx = x + dx[i];int ny = y + dy[i];if (isValid(nx, ny)&&isTargetValid()) {// 嘗試移動到這個位置int num = nx * n + ny;visited[nx][ny] = true;path.push_back(num);north[ny]--;west[nx]--;dfs(nx, ny);// 回溯visited[nx][ny] = false;path.pop_back();north[ny]++;west[nx]++;}}
}int main() {cin >> n;north.resize(n);west.resize(n);visited.resize(n, vector<bool>(n, false));// 讀取北墻靶子數字(自西向東)for (int i = 0; i < n; i++) {cin >> north[i];}// 讀取西墻靶子數字(自北向南)for (int i = 0; i < n; i++) {cin >> west[i];}// 起點是西北角(0,0),編號為0visited[0][0] = true;north[0]--; // 北墻最西邊的靶子west[0]--; // 西墻最北邊的靶子path.push_back(0);dfs(0, 0);// 輸出結果for (int i = 0; i < result.size(); i++) {if (i != 0) cout << " ";cout << result[i];}cout << endl;return 0;
}
九、9.裁紙刀 - 藍橋云課

(規律、思維)算法代碼:
#include <iostream>
using namespace std;
int main()
{int s;s=440+4-1;cout<<s;return 0;
}
十、10.九進制轉十進制 - 藍橋云課

(進制轉換)算法代碼: (兩種方法異曲同工)
#include<bits/stdc++.h>
using namespace std;int main() {string num = "2022"; // 九進制數int decimal = 0;int base = 9; // 九進制// 從最高位開始計算for (int i = 0; i < num.size(); i++) {int digit = num[i] - '0'; // 獲取當前位的數字int power = num.size() - 1 - i; // 計算當前位的權值指數decimal += digit * pow(base, power);}cout << decimal << endl; // 輸出結果return 0;
}
#include<bits/stdc++.h>
using namespace std;int main() {string num = "2022";int decimal = 0;int power = 1;// 從右向左計算for(int i = num.length() - 1; i >= 0; --i) {decimal += (num[i] - '0') * power;power *= 9;}cout << decimal << endl; // 輸出: 1478return 0;
}
十一、11.分巧克力 - 藍橋云課


(二分)算法代碼:?
#include <bits/stdc++.h>
using namespace std;
int n, k;
int max_num;
int ans;
vector<pair<int, int>> hw; // 存儲所有巧克力的高和寬int count_pieces(int mid)
{int cnt=0;for(auto &ch:hw){int h=ch.first;int w=ch.second;cnt+=(h/mid)*(w/mid);}return cnt;
}int main()
{cin >> n >> k;hw.resize(n);for (int i = 0; i < n; ++i) {cin >> hw[i].first >> hw[i].second;max_num = max(max_num, hw[i].first);max_num = max(max_num, hw[i].second);}int l = 1, r = max_num;ans = 1; // 初始化為最小可能邊長while(l<=r){int mid=l+(r-l)/2;int cnt=count_pieces(mid);if(cnt>=k){ans=mid;l=mid+1;}else{r=mid-1;}}cout<<ans<<endl;return 0;
}
十二、12.跑步鍛煉 - 藍橋云課

(模擬、枚舉)算法代碼:?
#include <bits/stdc++.h>
using namespace std;
int ans;
const int month_days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int week_day=6;bool isLeapYear(int year) {return (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0);
}int main()
{for(int year=2000;year<=2020;year++){for(int month=1;month<=12;month++){// 處理終止條件:2020年10月1日之后停止if (year == 2020 && month > 10) break;int days = month_days[month];// 處理閏年二月if (month == 2 && isLeapYear(year)) {days = 29;}for(int day=1;day<=days;day++){if(year==2020&&month==10&&day>=2){break;}if(day==1||week_day==1){ans+=2;}else{ans++;}week_day=(week_day+1)%7;}}}cout<<ans<<endl;return 0;
}
十三、13.蛇形填數 - 藍橋云課

(模擬、規律、思維)算法代碼:?
發現規律:
#include <bits/stdc++.h>
using namespace std;
int main()
{int ans=1;for(int i=1;i<20;i++){ans+=i*4;//對角線元素值=前一個元素+前一個元素的行號*4}cout<<ans;return 0;
}
數組模擬實現:
#include<bits/stdc++.h>
using namespace std;int mp[200][200], row = 0, col = 0, cnt = 1;int main() {mp[0][0] = 1;while(!mp[19][19]) {//右移mp[row][++col] = ++cnt;//左下方while(col) {mp[++row][--col] = ++cnt;}//下移mp[++row][col] = ++cnt;//右上方while(row) {mp[--row][++col] = ++cnt;}}/*for(int i = 0; i < 20; i++) {for(int j = 0; j < 20; j++) {cout << mp[i][j] << " ";}cout << endl;}*/cout << mp[19][19];return 0;
}
非常牛逼的掉頭想法(不需要數組):(自殘形愧)
#include <iostream>
using namespace std;
int main()
{int row=1,col=1,flag=1,num=1;while(true){if(row==1){col++;flag=1;num++;}if(col==1){row++;flag=-1;num++;}row+=flag;col-=flag;num++;if(row==20&&col==20) break;}cout<<num;return 0;
}
十四、14.貨物擺放 - 藍橋云課

(枚舉)算法代碼:
#include<stdio.h>// 定義長整型別名,用于處理大整數
typedef long long LL;int main() {// 題目給定的貨物總數(16位數)LL n = 2021041820210418;LL i, j, k; // 三個維度L、W、H的候選值int res = 0; // 結果計數器(方案總數)// 第一層循環:遍歷可能的第一個因數i// 優化:i只需遍歷到n的立方根,因為i^3 > n時不可能有解for(i = 1; i*i*i <= n; i++) {// 檢查i是否是n的因數if(n % i == 0) {// 第二層循環:遍歷可能的第二個因數j// 從i開始遍歷,避免重復計算相同的因數組合// 條件i*j*j <= n確保三個因數的乘積不超過nfor(j = i; i*j*j <= n; j++) {// 檢查j是否是(n/i)的因數if((n/i) % j == 0) {// 計算第三個因數kk = n / i / j;// 根據三個因數的關系計算排列組合數:// 情況1:三個數完全相同(i=j=k)if(i == j && j == k) {res += 1; // 只有1種排列方式}// 情況2:有兩個數相同(i=j或i=k或j=k)else if(i == j || i == k || j == k) {res += 3; // 3種排列方式}// 情況3:三個數都不同else {res += 6; // 6種排列方式(3! = 6)}}}}}// 輸出最終結果printf("%d", res);//2430return 0;
}

十五、15.購物單 - 藍橋云課

**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半價
**** 26.75 65折
**** 130.62 半價
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半價
**** 79.54 半價
**** 278.44 7折
**** 199.26 半價
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半價
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半價
**** 218.37 半價
**** 289.69 8折

算法代碼:?
#include <bits/stdc++.h>
using namespace std;
int main()
{double sum = 180.90*0.88+10.25*0.65+56.14*0.9+104.65*0.9+100.30*0.88+297.15*0.5+26.75*0.65+130.62*0.5+240.28*0.58+270.62*0.8+115.87*0.88+247.34*0.95+73.21*0.9+101.00*0.5+79.54*0.5+278.44*0.7+199.26*0.5+12.97*0.9+166.30*0.78+125.50*0.58+84.98*0.9+113.35*0.68+166.57*0.5+42.56*0.9+81.90*0.95+131.78*0.8+255.89*0.78+109.17*0.9+146.69*0.68+139.33*0.65+141.16*0.78+154.74*0.8+59.42*0.8+85.44*0.68+293.70*0.88+261.79*0.65+11.30*0.88+268.27*0.58+128.29*0.88+251.03*0.8+208.39*0.75+128.88*0.75+62.06*0.9+225.87*0.75+12.89*0.75+34.28*0.75+62.16*0.58+129.12*0.5+218.37*0.5+289.69*0.8;int a = (int)round(sum)/100*100+100;printf("%d",a);return 0;
}
十六、16.楊輝三角形 - 藍橋云課


(規律、思維、二分)算法代碼:?
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n; // 存儲輸入的N值/*
楊輝三角形觀察:11 11 2 11 3 3 1
1 4 6 4 1
...
數字首次出現一定在左側,因此可以忽略右側對稱部分
*/// 計算組合數C(x,k)
LL C(int x, int k) {LL ans = 1;for(int i = x, j = 1; j <= k; i--, j++) {ans = ans * i / j; // 計算組合數if(ans > n) return ans; // 超過n時提前返回}return ans;
}// 檢查當前斜行t中是否存在n
bool check(int t) {// 二分查找的下界是2t,上界取n和2t中的較大值LL l = 2 * t, r = max(n, l);while(l < r) {int mid = l + r >> 1; // 取中間值if(C(mid, t) >= n) r = mid; // 中間值大于等于n,調整上界else l = mid + 1; // 否則調整下界}if(C(r, t) != n) return false; // 沒找到n// 找到n,計算位置:(r+1)*r/2 + t + 1cout << (LL)(r + 1) * r / 2 + t + 1 << endl;return true;
}int main() {cin >> n; // 輸入要查找的數字N// 從最大的可能斜行t=17開始向下查找for(int t = 17; ; t--) {if(check(t)) break; // 找到就退出}return 0;
}
