2023年藍橋杯B組初賽(第七屆)

2021-08-15 21:10:10 字數 3710 閱讀 3448

寫在前面的話,藍橋杯快要開始了。畢竟參加了就得做些準備,今天開始做一些題目練習一下,為4月1號的比賽做些準備。

題目見:

第一題:

簡單的求和題。

#include

#include

using

namespace

std;

int a[110];

int main()

for(i=1;i<=100;i++)

cout

0;}

第二題:

暴力,i,j分別代表起點和終點,遍歷求解,簡單題。

也可以利用等差數列求和公式,求出以i開頭,j結尾等差數列的和。然後遍歷i,j看能不能讓sum恰好等於236

#include

#include

using

namespace

std;

int a[110];

int ans=0;

bool flag=false;

int main()

}if(flag) break;

}cout

0;}

第三題:

填數字問題,這裡很巧妙的運用了c++中的next_permutation(a,a+n);生成1-9的全排列。(注意標頭檔案#include

開始這道題目寫錯了,那個p,q是double型別,開始寫成了int型別,所以一直是錯的。以後注意型別問題。

還要注意的事情是,next_permutation生成全排列的時候注意要先給陣列賦值。比如a=;

#include

#include

#include

using

namespace

std;

int a[11];

int ans=0;

void init()

}void solve()

}while(next_permutation(a,a+9));

}int main()

第四題:程式填空-快速排序

剛剛學了快速排序演算法的原理,演算法思路就是:

先選定乙個基數,通常選定第乙個數就可以;

分別從左到右和從右到左遍歷,從右向左遍歷,使得左邊的數都小於基數,右邊的數都大於基數;再把基數查到對應的位置

這樣乙個陣列就分成兩端,重複。

這篇部落格講的非常好:

swap

(a,j,p)

第五題:程式填空-遞迴

對於f(int a,int k,int m,char b).a 是每個國家的最多指派人數,k表示當前是哪個國家,m表示還需要派送幾個人(可以為負數).b表示已經派送的人的字串。

所以這個題目在遞迴中間的的 第乙個迴圈表示從0~a[i]中讓i國選擇指派人數,內迴圈只是向b記錄的過程。

f

(a,k+1,m-i,b)

第六題:

dfs先填數然後判斷周圍是否可行,八數碼問題。

#include

#include

using

namespace

std;

intmap[3][4];

int vis[10];

int flag[3][4];

int dir[8][2]=;

int ans=0;

void init()

}flag[0][0]=0;

flag[2][3]=0;

memset(vis,0,sizeof(vis));

}void solve()}}

}if(book)

}void dfs(int index)

if(flag[x][y])}}

else

}int main()

暴力,依舊可以用生成全排列的方法先填數,然後再判斷是否行可行。next_penutation(a,a+n);

#include

#include

#include

using

namespace

std;

int a[10]=;

int ans=0;

int main()

}while(next_permutation(a,a+10));

cout

0;}

第七題:剪郵票問題

開始寫這道題目的時候一直不知道怎麼判斷5個數是不是連在一起。參考別人的思路終於搞懂了這道題目。

首先先用stl中的next_permutation生成5組數。

然後dfs判斷是否相連。

for(int i=0;i<3;i++)

}if(num==1) sum++;

這個部分寫的非常有趣。它的意思是如果我一次dfs遍歷過後,如果存在被標記為1的a[i][j](及我們塗色的方格)沒有被訪問過,那麼證明這次我們塗得顏色不相連。應為一次dfs把所有相連的格仔都標記了。

#include"iostream"

#include"algorithm"

#include"string.h"

using

namespace

std;

int ai[3][4];

int bi[12]=;

bool vis[3][4];

int num;

int sum=0;

int dir[4][2]=;

void dfs(int r,int c)

}int main()

}for(int i=0;i<3;i++)}}

if(num==1) sum++;

}while(next_permutation(bi,bi+12));

cout

0;}

第八題:四平方和問題

暴力,可以開乙個三層遍歷,第四層的數可以用總和減去求出來。(如果遍歷四層就會爆掉,==先前寫錯了哎)

#include

#include

#include

using

namespace

std;

int n;

bool flag=false;

int main()

}if(flag) break;

}if(flag) break;

}cout

<" "

<" "

<" "

0;}

第九:交換瓶子

貪心。

將要求瓶子的序號儲存在陣列b中,遍歷陣列a,如果a中當前位置的瓶子序號不對,就交換當前位置的瓶子和要求序號瓶子的位置。記下交換次數。

#include

using

namespace

std;

#define maxn 100010

int a[maxn],b[maxn];

int ans=0;

int main()

for(int i=0;iif(a[i]!=b[i])}}

}cout

0;}

第十:不會

2023年第七屆藍橋杯試題(C C 本科B組)

3.湊算式 b def a 10 c ghi 如果顯示有問題,可以參見 圖1.jpg 這個算式中a i代表1 9的數字,不同的字母代表不同的數字。比如 6 8 3 952 714 就是一種解法,5 3 1 972 486 是另一種解法。這個算式一共有多少種解法?注意 你提交應該是個整數,不要填寫任何...

2023年第七屆藍橋杯 C 省賽B組

有一堆煤球,堆成三角稜錐形。具體 第一層放1個,第二層3個 排列成三角形 第三層6個 排列成三角形 第四層10個 排列成三角形 如果一共有100層,共有多少個煤球?請填表示煤球總數目的數字。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。找下層數公式即可 a i a i 1 i 某...

交換瓶子 2023年第七屆藍橋杯

交換瓶子 有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正...