寫在前面的話,藍橋杯快要開始了。畢竟參加了就得做些準備,今天開始做一些題目練習一下,為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次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正...