蓝桥杯练习系统[C++]
目錄
數(shù)學(xué)
1084 用篩法求n以內(nèi)的素?cái)?shù)
1446 核桃的數(shù)量
1464 分解質(zhì)因數(shù)
枚舉
1022 篩選N以內(nèi)的素?cái)?shù)
1141 百錢百雞問(wèn)題
1199 哥德巴赫曾猜測(cè)
1259 送分題素?cái)?shù)
遞歸
1004 母牛的故事
1463 Sine之舞
1508 和最大子序列
1575 遞歸倒置字符數(shù)組
1544 特殊的質(zhì)數(shù)肋骨
動(dòng)態(tài)規(guī)劃
1557 聰明的旅行家
1610 傳球游戲(錯(cuò)誤8)
1633 數(shù)的統(tǒng)計(jì)
進(jìn)制
1572 進(jìn)制轉(zhuǎn)換(答案錯(cuò)誤27)
1934 十進(jìn)制數(shù)轉(zhuǎn)八進(jìn)制數(shù)
2619 二進(jìn)制問(wèn)題(時(shí)間超限27)
2080 十六進(jìn)制轉(zhuǎn)八進(jìn)制
2082 十六進(jìn)制轉(zhuǎn)十進(jìn)制?
2083 十進(jìn)制轉(zhuǎn)十六進(jìn)制?(答案錯(cuò)誤45)
?2218 二進(jìn)制數(shù)數(shù)(答案錯(cuò)誤17)
2248 輸出二進(jìn)制表示?
模擬
1429 蘭頓螞蟻(答案錯(cuò)誤25)
1480 模擬計(jì)算器(答案錯(cuò)誤82)
1481 剪刀石頭布(答案錯(cuò)誤80)?
數(shù)學(xué)
1084 用篩法求n以內(nèi)的素?cái)?shù)
題目描述
用篩法求之N內(nèi)的素?cái)?shù)。
輸入
N
輸出
0~N的素?cái)?shù)
樣例輸入復(fù)制
100樣例輸出復(fù)制
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97題目分析:
篩法解釋
給定一列數(shù)組,假設(shè)是1~25:
第一步
列出2以后的所有序列:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
第二步
標(biāo)出序列中的第一個(gè)素?cái)?shù),也就是2,序列變成:
2?3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
將剩下序列中,劃掉2的倍數(shù)(用刪除線標(biāo)出),序列變成:
2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25
如果現(xiàn)在這個(gè)序列中最大數(shù)小于最后一個(gè)標(biāo)出的素?cái)?shù)的平方,那么剩下的序列中所有的數(shù)都是素?cái)?shù),否則回到第二步。
本例中,因?yàn)?5大于2的平方,我們返回第二步:
剩下的序列中第一個(gè)素?cái)?shù)是3,將主序列中3的倍數(shù)劃出(刪除線),主序列變成:
2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25
我們得到的素?cái)?shù)有:2,3
25仍然大于3的平方,所以我們還要返回第二步:
現(xiàn)在序列中第一個(gè)素?cái)?shù)是5,同樣將序列中5的倍數(shù)劃出,主序列成了:
2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25
我們得到的素?cái)?shù)有:2 3 5 11 13 17 23 。
因?yàn)?5等于5的平方,跳出循環(huán).
在本題中,可根據(jù)數(shù)值來(lái)確定刪去倍數(shù);
若n=100,則用篩法篩到11
若n=10,則用篩法篩到4
代碼運(yùn)算:
#include<iostream> using namespace std;int main() {int n;cin>>n;for(int i=2;i<=n;i++){if(i==2||i==3||i==5||i==7||i==11||i%2!=0&&i%3!=0&&i%5!=0&&i%7!=0&&i%11!=0){cout<<i<<endl;}}return 0; }?運(yùn)行結(jié)果:
備注:這種方法在n較小時(shí)可用,較大時(shí)就麻煩了?
1446 核桃的數(shù)量
題目描述
小張是軟件項(xiàng)目經(jīng)理,他帶領(lǐng)3個(gè)開(kāi)發(fā)組。工期緊,今天都在加班呢。為鼓舞士氣,小張打算給每個(gè)組發(fā)一袋核桃(據(jù)傳言能補(bǔ)腦)。他的要求是:
1.? 各組的核桃數(shù)量必須相同
2.? 各組內(nèi)必須能平分核桃(當(dāng)然是不能打碎的)
3.? 盡量提供滿足1,2條件的最小數(shù)量(節(jié)約鬧革命嘛)
?
輸入
輸入包含三個(gè)正整數(shù)a,? b,? c,表示每個(gè)組正在加班的人數(shù),用空格分開(kāi)(a,b,c< 30)??
輸出
輸出一個(gè)正整數(shù),表示每袋核桃的數(shù)量。
樣例輸入復(fù)制
2 4 5樣例輸出復(fù)制
20?題目分析:
不用理這么多,要想滿足題目要求,只需要核桃的數(shù)量同時(shí)滿足三個(gè)科室整除即可
代碼運(yùn)算:
#include<iostream> using namespace std;int main() {int a,b,c;cin>>a>>b>>c;for(int i=1;;i++){if(i%a==0&&i%b==0&&i%c==0){cout<<i;break;}}return 0; }運(yùn)行結(jié)果:?
1464 分解質(zhì)因數(shù)
題目描述
求出區(qū)間[a,b]中所有整數(shù)的質(zhì)因數(shù)分解。
提示
先篩出所有素?cái)?shù),然后再分解。
?
輸入
輸入兩個(gè)整數(shù)a,b。?
2< =a< =b< =10000
輸出
每行輸出一個(gè)數(shù)的分解,形如k=a1*a2*a3...(a1< =a2< =a3...,k也是從小到大的)(具體可看樣例)?
樣例輸入復(fù)制
3 10樣例輸出復(fù)制
3=3 4=2*2 5=5 6=2*3 7=7 8=2*2*2 9=3*3 10=2*5分析:
先判斷是否是素?cái)?shù),再進(jìn)行質(zhì)因數(shù)分解
if (k <= 2) return false;else{for (int i = 2; i * i <= k; i++) //考慮9=3*3的情況{if (k % i == 0)return false;}return true;}代碼:
#include<iostream> using namespace std; bool Zhishu(int k) {if (k <= 2) return false;else{for (int i = 2; i * i <= k; i++){if (k % i == 0)return false;}return true;} } void Fenjie(int k) {if (Zhishu(k)){cout << k << "=" << k;}else{cout << k << "=";for (int i = 2; i <= k; i++){if (k % i == 0){cout << i;k /= i;if (k != 1)cout << "*";elsebreak;i--; /如/8=2*2*2的情況}}} } int main() {int a, b;cin >> a >> b;for (int i = a; i <= b; i++){Fenjie(i);cout << endl;}return 0; }運(yùn)行結(jié)果:
枚舉
1022 篩選N以內(nèi)的素?cái)?shù)
題目描述
用簡(jiǎn)單素?cái)?shù)篩選法求N以內(nèi)的素?cái)?shù)。
輸入
N
輸出
2~N的素?cái)?shù)
樣例輸入復(fù)制
100樣例輸出復(fù)制
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97代碼:
#include<iostream> #include<cmath> using namespace std; bool Is_sushu(int n) {for (int i = 2; i <= floor(sqrt(n) + 0.5); i++){if (n % i == 0)return 0;}return n; } int main() {int n;cin >> n;for (int i =2; i <=n; i++){if (Is_sushu(i) != 0){cout << i <<endl;}}return 0; }運(yùn)行結(jié)果:
1141 百錢百雞問(wèn)題
題目描述
中國(guó)古代數(shù)學(xué)家張丘建在他的《算經(jīng)》中提出了著名的“百錢買百雞問(wèn)題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,問(wèn)翁、母、雛各幾何?
輸入
無(wú)輸入
輸出
給出所有的解,每組解占一行
解的順序:按“字典序”排列,即公雞數(shù)少的在前;公雞數(shù)相同,母雞數(shù)少的在前
格式:
cock=%d,hen=%d,chicken=%d\n
樣例輸入復(fù)制
無(wú)樣例輸出復(fù)制
cock=0,hen=25,chicken=75 cock=4,hen=18,chicken=78 cock=8,hen=11,chicken=81 cock=12,hen=4,chicken=84題目分析:
這道題實(shí)際上考察for循環(huán)嵌套
代碼:
#include<iostream> using namespace std; int main() {for(int x=0;x<100;x++){for(int y=0;y<100;y++){int z=200-8*x-5*y; //兩個(gè)式子的和if(z>=0&&z<100&&x+y+z==100){cout<<"cock="<<x<<","<<"hen="<<y<<","<<"chicken="<<z<<endl;}}}return 0; }?運(yùn)行結(jié)果:
1199 哥德巴赫曾猜測(cè)
題目描述
德國(guó)數(shù)學(xué)家哥德巴赫曾猜測(cè):任何大于6的偶數(shù)都可以分解成兩個(gè)素?cái)?shù)(素?cái)?shù)對(duì))的和。但有些偶數(shù)可以分解成多種素?cái)?shù)對(duì)的和,如: 10=3+7,10=5+5,即10可以分解成兩種不同的素?cái)?shù)對(duì)
輸入
輸入任意的>6的正偶數(shù)(<32767)
輸出
試求給出的偶數(shù)可以分解成多少種不同的素?cái)?shù)對(duì)(注: A+B與B+A認(rèn)為是相同素?cái)?shù)對(duì))
樣例輸入復(fù)制
1234樣例輸出復(fù)制
25題目分析:
在for循環(huán)里面判斷是否為素?cái)?shù)即可。在主函數(shù)外再定義并實(shí)現(xiàn)一個(gè)判斷素?cái)?shù)函數(shù)
代碼:
#include<iostream> #include<cmath> using namespace std;bool Issushu(int k) {for (int i = 2; i <= floor(sqrt(k) + 0.5); i++){if (k % i == 0){return 0;}}return 1; } int main() {int n;cin >> n;int ans = 0;for (int i = 2; i <= n / 2; i++){if (Issushu(i) == 1 && Issushu(n - i) == 1){++ans;}}cout << ans << endl;return 0; }運(yùn)行結(jié)果:?
?
1259 送分題素?cái)?shù)
題目描述
輸出100->200之間的素?cái)?shù)的個(gè)數(shù),以及所有的素?cái)?shù)。
輸入
無(wú)
輸出
100->200之間的素?cái)?shù)的個(gè)數(shù),以及所有的素?cái)?shù)。
樣例輸入復(fù)制
無(wú)樣例輸出復(fù)制
21 101 103 ... 197 199題目分析:
1.關(guān)于素?cái)?shù)的判定,即把要判斷的數(shù)跟他的平方根進(jìn)行相余
代碼:
#include<iostream> #include<cmath> using namespace std; bool Is_sushu(int n) {for (int i = 2; i <= floor(sqrt(n) + 0.5); i++){if (n % i == 0)return 0;}return n; } int main() {int count = 0;for (int i = 100; i <= 200; i++){if (Is_sushu(i) != 0){count++;}}cout << count << endl;for (int i = 100; i <= 200; i++){if (Is_sushu(i) != 0){cout << i << "\t";}}cout << endl;return 0; }運(yùn)行結(jié)果:
遞歸
1004 母牛的故事
題目描述
有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個(gè)年頭開(kāi)始,每年年初也生一頭小母牛。請(qǐng)編程實(shí)現(xiàn)在第n年的時(shí)候,共有多少頭母牛?
輸入
輸入數(shù)據(jù)由多個(gè)測(cè)試實(shí)例組成,每個(gè)測(cè)試實(shí)例占一行,包括一個(gè)整數(shù)n(0<n<55),n的含義如題目中描述。
n=0表示輸入數(shù)據(jù)的結(jié)束,不做處理。
輸出
對(duì)于每個(gè)測(cè)試實(shí)例,輸出在第n年的時(shí)候母牛的數(shù)量。
每個(gè)輸出占一行。
樣例輸入復(fù)制
2 4 5 0樣例輸出復(fù)制
2 4 6題目分析:
遞歸題最重要要找到相互之間存在的關(guān)系,
我們先列出一個(gè)表格,把每一年對(duì)應(yīng)的母牛數(shù)量寫(xiě)出來(lái)。
| 第 n年: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| f[n] 頭牛: | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 |
先看第 4 年,對(duì)應(yīng)有 4 頭母牛,4 = 3+1;
再看第 5 年,對(duì)應(yīng)有 6 頭母牛,6 = 4+2;
最后看第 6 年,對(duì)應(yīng)有 9 頭母牛,9 = 6+3;
沒(méi)錯(cuò),是有規(guī)律的,該年母牛的數(shù)量就是一年前的數(shù)量再加上三年前的數(shù)量,
用公式表示就是 f[n] = f[n-1] + f[n-3]
代碼:
#include<iostream> using namespace std; int main() {int n;int f[55] = { 0,1,2,3 };for (int i = 4; i < 55; i++)f[i] = f[i - 1] + f[i - 3];while (cin >> n && n != 0){cout << f[n] << endl;}return 0; }?運(yùn)行結(jié)果:
1463 Sine之舞
題目描述
最近FJ為他的奶牛們開(kāi)設(shè)了數(shù)學(xué)分析課,FJ知道若要學(xué)好這門課,必須有一個(gè)好的三角函數(shù)基本功。所以他準(zhǔn)備和奶牛們做一個(gè)“Sine之舞”的游戲,寓教于樂(lè),提高奶牛們的計(jì)算能力。
不妨設(shè)
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想讓奶牛們計(jì)算Sn的值,請(qǐng)你幫助FJ打印出Sn的完整表達(dá)式,以方便奶牛們做題。
?
輸入
僅有一個(gè)數(shù):N<201。
輸出
請(qǐng)輸出相應(yīng)的表達(dá)式Sn,以一個(gè)換行符結(jié)束。輸出中不得含有多余的空格或換行、回車符。
樣例輸入復(fù)制
3樣例輸出復(fù)制
((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1題目解析:
這道題的輸出看起來(lái)復(fù)雜,其實(shí)不過(guò)就是for循環(huán)和遞歸的不斷輸出而成
代碼:
//An = sin(1–sin(2 + sin(3–sin(4 + ...sin(n))...) // Sn = (...(A1 + n)A2 + n - 1)A3 + ... + 2)An + 1 //打印出Sn的完整表達(dá)式 // 樣例輸入 // 3 // 樣例輸出 // ((sin(1) + 3)sin(1 - sin(2)) + 2)sin(1 - sin(2 + sin(3))) + 1 //1.輸入樣例 //2.根據(jù)式子特點(diǎn)進(jìn)行循環(huán) #include<iostream> using namespace std; void An(int n) {for (int i = 1; i <= n; i++){cout << "sin(" << i;if (i == n) break;if (i % 2){cout << "-";}else{cout << "+";}}while (n--){cout << ")";} } int main() {int n;cin >> n;for (int i = 2; i <= n; i++){cout << "(";}for (int i = 1; i <= n; i++){An(i);cout << "+" << n - i + 1;if (n - i + 1 != 1){cout << ")";}elsebreak;}return 0; }?運(yùn)行結(jié)果:
1508 和最大子序列
題目描述
對(duì)于一個(gè)給定的長(zhǎng)度為N的整數(shù)序列A,它的“子序列”的定義是:A中非空的一段連續(xù)的元素(整數(shù))。你要完成的任務(wù)是,在所有可能的子序列中,找到一個(gè)子序列,該子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你輸出這個(gè)最大值。
輸入
輸入文件的第一行包含一個(gè)整數(shù)N,第二行包含N個(gè)整數(shù),表示A。?
其中?
1? < =? N? < =? 100000?
-10000? < =? A[i]? < = 10000?
輸出
輸出僅包含一個(gè)整數(shù),表示你算出的答案。?
樣例輸入復(fù)制
5 3 -2 3 -5 4樣例輸出復(fù)制
4代碼:
#include<iostream> using namespace std; int main() {int n,ch,sum=0,max=-10086;cin >> n;int* a = new int[n];for (int i = 0; i < n; i++){cin >> ch;a[i] = ch;sum += a[i];if (max < sum){max = sum;}if (sum < 0) //對(duì)于當(dāng)前這個(gè)數(shù),加入總和后若一旦使sum為負(fù),立即置0處理,也就是從下一個(gè)數(shù)開(kāi)始重新對(duì)sum計(jì)數(shù)求和,這樣就在保留了sum為負(fù)之前的最大max的同時(shí)又可以不影響接下來(lái)可能超過(guò)前面max的max數(shù)值所可能的交換。{sum = 0;}}cout << max << endl;return 0; }?運(yùn)行結(jié)果:
1575 遞歸倒置字符數(shù)組
題目描述
完成一個(gè)遞歸程序,倒置字符數(shù)組。并打印實(shí)現(xiàn)過(guò)程
遞歸邏輯為:
當(dāng)字符長(zhǎng)度等于1時(shí),直接返回
否則,調(diào)換首尾兩個(gè)字符,在遞歸地倒置字符數(shù)組的剩下部分
輸入
字符數(shù)組長(zhǎng)度及該數(shù)組?
輸出
在求解過(guò)程中,打印字符數(shù)組的變化情況。?
最后空一行,在程序結(jié)尾處打印倒置后該數(shù)組的各個(gè)元素。?
樣例輸入復(fù)制
5 abcde樣例輸出復(fù)制
ebcda edcbaedcba代碼:
#include<iostream> #include<string> using namespace std; int n; string str; void BEswap(int l, int r) {if (l == r || l > (r - 1) / 2) return;std::swap(str[l], str[r]);cout << str << endl;BEswap(l + 1, r - 1); } int main() {cin >> n >> str;BEswap(0, n - 1);cout << endl << str << endl;return 0; }?運(yùn)行結(jié)果:
1544 特殊的質(zhì)數(shù)肋骨
題目描述
農(nóng)民約翰母牛總是產(chǎn)生最好的肋骨。你能通過(guò)農(nóng)民約翰和美國(guó)農(nóng)業(yè)部標(biāo)記在每根肋骨上的數(shù)字認(rèn)出它們。農(nóng)民約翰確定他賣給買方的是真正的質(zhì)數(shù)肋骨,是因?yàn)閺挠疫呴_(kāi)始切下肋骨,每次還剩下的肋骨上的數(shù)字都組成一個(gè)質(zhì)數(shù)。
例如有四根肋骨的數(shù)字分別是:7? 3? 3? 1,那么全部肋骨上的數(shù)字? 7331是質(zhì)數(shù);三根肋骨? 733是質(zhì)數(shù);二根肋骨? 73? 是質(zhì)數(shù);當(dāng)然,最后一根肋骨? 7? 也是質(zhì)數(shù)。7331? 被叫做長(zhǎng)度? 4? 的特殊質(zhì)數(shù)。
寫(xiě)一個(gè)程序?qū)o定的肋骨的數(shù)目? N? (1< =N< =8),求出所有的特殊質(zhì)數(shù)。數(shù)字1不被看作一個(gè)質(zhì)數(shù)。
輸入
單獨(dú)的一行包含N。?(1< =N< =8)
輸出
按順序輸出長(zhǎng)度為? N? 的特殊質(zhì)數(shù),每行一個(gè)。?
樣例輸入復(fù)制
4樣例輸出復(fù)制
2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393代碼:
#include<iostream> #include<cmath> using namespace std; bool Issushu(int n) {for (int i = 2; i <= floor(sqrt(n) + 0.5); i++){if (n % i == 0){return false;}}return true; } int main() {int n;cin >> n;int max = pow(10, n) - 1;int min = 2*pow(10, n - 1);for (int i = min; i <= max; i++){int k = n;while (k > 0){if (Issushu(i / pow(10, k - 1))) k--;elsebreak;}if (k == 0)cout << i << endl;elsei = i - 1 + pow(10, k - 1);}return 0; }?運(yùn)行結(jié)果:
動(dòng)態(tài)規(guī)劃
1557 聰明的旅行家
題目描述
如果有人認(rèn)為吃東西只需要嘴巴,那就錯(cuò)了。
都知道舌頭有這么一個(gè)特性,“由簡(jiǎn)入奢易,由奢如簡(jiǎn)難”(據(jù)好事者考究,此規(guī)律也適合許多其他情況)。具體而言,如果是甜食,當(dāng)你吃的食物不如前面剛吃過(guò)的東西甜,就很不爽了。
大寶是一個(gè)聰明的美食家,當(dāng)然深諳此道。一次他來(lái)到某小吃一條街,準(zhǔn)備從街的一頭吃到另一頭。為了吃得爽,他大費(fèi)周章,得到了各種食物的“美味度”。他拒絕不爽的經(jīng)歷,不走回頭路而且還要爽歪歪(爽的次數(shù)盡量多)。
輸入
兩行數(shù)據(jù)。?
第一行為一個(gè)整數(shù)n,表示小吃街上小吃的數(shù)量?
第二行為n個(gè)整數(shù),分別表示n種食物的“美味度”?
數(shù)據(jù)規(guī)模和約定
美味度為0到100的整數(shù)
n< 1000
輸出
一個(gè)整數(shù),表示吃得爽的次數(shù)?
樣例輸入復(fù)制
10 3 18 7 14 10 12 23 41 16 24樣例輸出復(fù)制
6答案鏈接:WU-藍(lán)橋杯算法提高VIP-聰明的美食家 (C++代碼)-Dotcpp編程社區(qū)
解析:?
1.要使爽的次數(shù)足夠多,則根據(jù)美味度從小到大進(jìn)行品嘗
2.定義一個(gè)專門存放次數(shù)的數(shù)組,采用兩個(gè)數(shù)組指針,i指針比j指針走快一步,如果前后之間形成遞增關(guān)系,則次數(shù)加1
3.如果沒(méi)有遞增,則次數(shù)不變
--------------------------------------------------------------------------
數(shù)組由小到大進(jìn)行排序:
#include<algorithm>
.....
sort(數(shù)組名,數(shù)組名+個(gè)數(shù));
代碼:
#include <iostream> #include <algorithm> using namespace std; int main() { int n; cin >> n; int *a = new int [n]; int *b = new int [n]; //開(kāi)辟兩個(gè)動(dòng)態(tài)數(shù)組for(int i = 0; i < n; i++) {cin >> a[i]; b[i]=1;//b[i]表示前i+1個(gè)數(shù)中的最大不下降子序列的長(zhǎng)度 初始值為1 }for(int i = 0; i < n; i++) { for(int j = 0; j < i; j++) { if(a[i] >=a[j]) //如果a[i]大于等于a[j],那么最大不下降子序列的長(zhǎng)度就會(huì)+1b[i] = max(b[i], b[j]+1); //我們?nèi)≥^大的那個(gè)} } sort(b,b+n);//對(duì)數(shù)組進(jìn)行排序cout<<b[n-1]<<endl;//輸出最大值return 0;運(yùn)行結(jié)果:
1610 傳球游戲(錯(cuò)誤8)
題目描述
上體育課的時(shí)候,小蠻的老師經(jīng)常帶著同學(xué)們一起做游戲。這次,老師帶著同學(xué)們一起做傳球游戲。
游戲規(guī)則是這樣的:n個(gè)同學(xué)站成一個(gè)圓圈,其中的一個(gè)同學(xué)手里拿著一個(gè)球,當(dāng)老師吹哨子時(shí)開(kāi)始傳球,每個(gè)同學(xué)可以把球傳給自己左右的兩個(gè)同學(xué)中的一個(gè)(左右任意),當(dāng)老師再次吹哨子時(shí),傳球停止,此時(shí),拿著球沒(méi)傳出去的那個(gè)同學(xué)就是敗者,要給大家表演一個(gè)節(jié)目。
聰明的小蠻提出一個(gè)有趣的問(wèn)題:有多少種不同的傳球方法可以使得從小蠻手里開(kāi)始傳的球,傳了m次以后,又回到小蠻手里。兩種傳球的方法被視作不同的方? 法,當(dāng)且僅當(dāng)這兩種方法中,接到球的同學(xué)按接球順序組成的序列是不同的。比如有3個(gè)同學(xué)1號(hào)、2號(hào)、3號(hào),并假設(shè)小蠻為1號(hào),球傳了3次回到小蠻手里的方? 式有1-> 2-> 3-> 1和1-> 3-> 2-> 1,共2種。
?
輸入
共一行,有兩個(gè)用空格隔開(kāi)的整數(shù)n,m(3< =n< =30,1< =m< =30)。?
數(shù)據(jù)規(guī)模和約定
100%的數(shù)據(jù)滿足:3< =n< =30,1< =m< =30
?
輸出
t共一行,有一個(gè)整數(shù),表示符合題意的方法數(shù)。?
樣例輸入復(fù)制
3 3樣例輸出復(fù)制
2答案原出處:藍(lán)橋杯算法訓(xùn)練VIP-傳球游戲-題解(C++代碼)(含思路)-Dotcpp編程社區(qū)
解析:
假設(shè)有3個(gè)人,將每個(gè)人每次的獲球情況組成一個(gè)數(shù)組,求出的數(shù)組的答案就是不同的傳遞情況
動(dòng)態(tài)規(guī)劃思路
先通過(guò)最簡(jiǎn)單的情況推出規(guī)律
eg:n=3,m=3,開(kāi)辟一個(gè)數(shù)組dp[i][j],i為傳球次數(shù),j為人數(shù),dp[i][j]表示的是第i的次傳球傳到j(luò)的個(gè)人手中的可能性
最初還未開(kāi)始傳球,球在1的個(gè)人手中,且傳0次球,故dp = (1,0,0)
然后開(kāi)始傳球,由于最初球在1手中,故,1只能將球傳出去,自己必然得不到球,而他也只能向左或右傳球,故此時(shí)第一個(gè)人得到球的可能性為0種,第二第三個(gè)人的可能性為1種,dp = (0,1,1)
進(jìn)行第二次傳球:此時(shí)球在第二個(gè)人或第三個(gè)人手中,先討論第二個(gè)人,它只能將球傳給第一個(gè)人或第三個(gè)人,再討論三的個(gè)人傳球,它可以傳球給第一個(gè)和第二個(gè)人,故第一個(gè)人有兩種得球可能性,第二第三個(gè)人各一種,dp = (2, 1,1)
將dp數(shù)組列出找規(guī)律
1,0,0
0,1,1
2,1,1
發(fā)現(xiàn)下一行的元素等于上一行對(duì)應(yīng)列的左邊和右邊的元素的和
故就推出了規(guī)律
dp[i][j] = dp[i-1][j-1]+dp[i-1][j+1]
但還要考慮在兩邊的情況,需單獨(dú)列出,到此思路就搞定了
代碼:
#include<iostream> using namespace std; int a[40][40]; int main() {int m, n;cin >> m >> n;a[0][0] = 1;for (int i = 1; i <= m; ++i){for (int j = 0; j < n; ++j){if (j == 0){a[i][0] = a[i - 1][n-2] + a[i - 1][n - 1];}else if (j == n - 1){a[i][n - 1] = a[i - 1][0] + a[i - 1][n - 2];}else{a[i][j] = a[i - 1][j - 1] + a[i - 1][j + 1];}}}cout << a[m][0];return 0; }?運(yùn)行結(jié)果:
1633 數(shù)的統(tǒng)計(jì)
題目描述
在一個(gè)有限的正整數(shù)序列中,有些數(shù)會(huì)多次重復(fù)出現(xiàn)在這個(gè)序列中。
如序列:3,1,2,1,5,1,2。其中1就出現(xiàn)3次,2出現(xiàn)2次,3出現(xiàn)1? 次,5出現(xiàn)1次。
你的任務(wù)是對(duì)于給定的正整數(shù)序列,從小到大依次輸出序列中出現(xiàn)的數(shù)及出現(xiàn)的次數(shù)。
?
輸入
第一行正整數(shù)n,表示給定序列中正整數(shù)的個(gè)數(shù)。?
第二行是n? 個(gè)用空格隔開(kāi)的正整數(shù)x,代表給定的序列。
數(shù)據(jù)規(guī)模和約定
數(shù)據(jù):n< =1000;0< x< =1000,000。
輸出
若干行,每行兩個(gè)用一個(gè)空格隔開(kāi)的數(shù),第一個(gè)是數(shù)列中出現(xiàn)的數(shù),第二個(gè)是該數(shù)在序列中出現(xiàn)的次數(shù)。?
樣例輸入復(fù)制
12 8 2 8 2 2 11 1 1 8 1 13 13樣例輸出復(fù)制
1 3 2 3 8 3 11 1 13 2解析:
1.sort排序
2.定義k來(lái)表示數(shù)組相等的數(shù),sum計(jì)數(shù)
代碼:
#include<iostream> #include<algorithm> using namespace std; int main() {int n,ch;cin >> n;int* a = new int[n];for (int i = 0; i < n; i++){cin >> ch;a[i] = ch;}sort(a, a + n);int k = 0;while (k < n){int sum = 1;while (a[k] == a[k + 1]){++sum;k++;}cout << a[k] << "\t" << sum << endl;k++;}return 0; }?運(yùn)行結(jié)果:
進(jìn)制
?做到進(jìn)制,我看的這篇博客真的很棒,其它的做法或多或少有點(diǎn)彎彎繞繞,但這篇單刀直入:(64條消息) C++中八進(jìn)制、十進(jìn)制和十六進(jìn)制之間的相互轉(zhuǎn)換_福小簡(jiǎn)的博客-CSDN博客
這篇博客是關(guān)于二進(jìn)制函數(shù)bitset的相關(guān)使用,用這篇內(nèi)容的方法解決問(wèn)題特別簡(jiǎn)單:(64條消息) c++ bitset類用法_Liam Q的專欄-CSDN博客
1572 進(jìn)制轉(zhuǎn)換(答案錯(cuò)誤27)
題目描述
程序提示用戶輸入三個(gè)字符,每個(gè)字符取值范圍是0-9,A-F。然后程序會(huì)把這三個(gè)字符轉(zhuǎn)化為相應(yīng)的十六進(jìn)制整數(shù),并分別以十六進(jìn)制,十進(jìn)制,八進(jìn)制輸出。
輸入
輸入只有一行,即三個(gè)字符。?
輸出
三個(gè)整數(shù),中間用空格隔開(kāi)。
樣例輸入復(fù)制
FFF樣例輸出復(fù)制
FFF 4095 7777代碼:
#include<iostream> using namespace std; int main() {int n;cin >> hex >> n;cout << hex << n << "\t";cout << dec << n << "\t";cout << oct << n << endl;return 0; }?運(yùn)行結(jié)果:
1934 十進(jìn)制數(shù)轉(zhuǎn)八進(jìn)制數(shù)
題目描述
編寫(xiě)函數(shù),其功能為把一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換為其對(duì)應(yīng)的八進(jìn)制數(shù)。程序讀入一個(gè)十進(jìn)制數(shù),調(diào)用該函數(shù)實(shí)現(xiàn)數(shù)制轉(zhuǎn)換后,輸出對(duì)應(yīng)的八進(jìn)制數(shù)。輸入
9274輸出
22072樣例輸入復(fù)制
18樣例輸出復(fù)制
22代碼:
#include<iostream> using namespace std; int main() {int n;cin>>n;cout<<oct<<n<<endl;return 0; }運(yùn)行結(jié)果:?
?
2619 二進(jìn)制問(wèn)題(時(shí)間超限27)
題目描述
小藍(lán)最近在學(xué)習(xí)二進(jìn)制。他想知道 1 到 N 中有多少個(gè)數(shù)滿足其二進(jìn)制表示中恰好有 K 個(gè) 1。你能幫助他嗎?
輸入
輸入一行包含兩個(gè)整數(shù) N 和 K。
輸出
輸出一個(gè)整數(shù)表示答案。
樣例輸入復(fù)制
7 2樣例輸出復(fù)制
3?解析:
1.將每個(gè)遍歷到的數(shù)字轉(zhuǎn)換為二進(jìn)制? bitset<4>a(i);
2.應(yīng)用二進(jìn)制a.size()函數(shù)求出1的個(gè)數(shù),累加
3.輸出累加后的count
(58條消息) c++ bitset類用法_Liam Q的專欄-CSDN博客
代碼:
#include<iostream> #include<bitset> using namespace std; int main() {int N, K, n, count = 0;cin >> N >> K;for (int i = 1; i <= N; ++i){bitset<4>a(i);if (a.count() == K){++count;}}cout << count << endl;return 0; }運(yùn)行結(jié)果:
2080 十六進(jìn)制轉(zhuǎn)八進(jìn)制
題目描述
給定n個(gè)十六進(jìn)制正整數(shù),輸出它們對(duì)應(yīng)的八進(jìn)制數(shù)。
輸入
輸入的第一行為一個(gè)正整數(shù)n (1<=n<=10)。
接下來(lái)n行,每行一個(gè)由0~9、大寫(xiě)字母A~F組成的字符串,表示要轉(zhuǎn)換的十六進(jìn)制正整數(shù),每個(gè)十六進(jìn)制數(shù)長(zhǎng)度不超過(guò)100000。
輸出
輸出n行,每行為輸入對(duì)應(yīng)的八進(jìn)制正整數(shù)。
【注意】
輸入的十六進(jìn)制數(shù)不會(huì)有前導(dǎo)0,比如012A。
輸出的八進(jìn)制數(shù)也不能有前導(dǎo)0。
樣例輸入復(fù)制
2 39 123ABC樣例輸出復(fù)制
71 4435274代碼:
#include<iostream> #include<string> using namespace std; int main() {int n,ch;cin>>n;for(int i=0;i<n;i++){cin>>hex>>ch;cout<<oct<<ch<<endl;}return 0; }?運(yùn)行結(jié)果:
2082 十六進(jìn)制轉(zhuǎn)十進(jìn)制?
題目描述
從鍵盤輸入一個(gè)不超過(guò)8位的正的十六進(jìn)制數(shù)字符串,將它轉(zhuǎn)換為正的十進(jìn)制數(shù)后輸出。
注:十六進(jìn)制數(shù)中的10~15分別用大寫(xiě)的英文字母A、B、C、D、E、F表示。
輸入
一個(gè)十六進(jìn)制數(shù)
輸出
對(duì)應(yīng)得十進(jìn)制
樣例輸入復(fù)制
FFFF樣例輸出復(fù)制
65535代碼:
#include<iostream> using namespace std; int main() {int str;cin>>hex>>str;cout<<dec<<str<<endl;return 0; }?運(yùn)行結(jié)果:
2083 十進(jìn)制轉(zhuǎn)十六進(jìn)制?(答案錯(cuò)誤45)
題目描述
十六進(jìn)制數(shù)是在程序設(shè)計(jì)時(shí)經(jīng)常要使用到的一種整數(shù)的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個(gè)符號(hào),分別表示十進(jìn)制數(shù)的0至15。十六進(jìn)制的計(jì)數(shù)方法是滿16進(jìn)1,所以十進(jìn)制數(shù)16在十六進(jìn)制中是10,而十進(jìn)制的17在十六進(jìn)制中是11,以此類推,十進(jìn)制的30在十六進(jìn)制中是1E。
給出一個(gè)非負(fù)整數(shù),將它表示成十六進(jìn)制的形式。
輸入
輸入包含一個(gè)非負(fù)整數(shù)a,表示要轉(zhuǎn)換的數(shù)。0<=a<=2147483647
輸出
輸出這個(gè)整數(shù)的16進(jìn)制表示
樣例輸入復(fù)制
30樣例輸出復(fù)制
1E代碼:
#include<iostream> using namespace std; int main() {int ch;cin >> ch;cout << hex << ch << endl;return 0; }?運(yùn)行結(jié)果:
?2218 二進(jìn)制數(shù)數(shù)(答案錯(cuò)誤17)
題目描述
給定L,R。統(tǒng)計(jì)[L,R]區(qū)間內(nèi)的所有數(shù)在二進(jìn)制下包含的“1”的個(gè)數(shù)之和。
如5的二進(jìn)制為101,包含2個(gè)“1”。
輸入
第一行包含2個(gè)數(shù)L,R
輸出
一個(gè)數(shù)S,表示[L,R]區(qū)間內(nèi)的所有數(shù)在二進(jìn)制下包含的“1”的個(gè)數(shù)之和。
樣例輸入復(fù)制
2 3樣例輸出復(fù)制
3代碼:
#include<iostream> #include<bitset> using namespace std; int main() {int L, R, sum = 0;cin >> L >> R;for (int i = L; i <= R; i++){bitset<4> a(i);sum += a.count();}cout << sum << endl;return 0; }?運(yùn)行結(jié)果:
2248 輸出二進(jìn)制表示?
題目描述
輸入[-128,127]內(nèi)的整數(shù),輸出其二進(jìn)制表示。
輸入
一個(gè)滿足題目要求的輸入范例。
輸入數(shù)據(jù)中每一個(gè)數(shù)的范圍。
例:0<n,m<100, 0<=矩陣中的每個(gè)數(shù)<=1000。
輸出
與上面的樣例輸入對(duì)應(yīng)的輸出。
樣例輸入復(fù)制
7樣例輸出復(fù)制
00000111代碼:
#include<iostream> #include<bitset> using namespace std; int main() {int ch;cin >> ch;if (ch>= -128 || ch<=127){cout << bitset<8>(ch);}return 0; }?運(yùn)行結(jié)果:
模擬
1429 蘭頓螞蟻(答案錯(cuò)誤25)
題目描述
蘭頓螞蟻,是于1986年,由克里斯·蘭頓提出來(lái)的,屬于細(xì)胞自動(dòng)機(jī)的一種。
平面上的正方形格子被填上黑色或白色。在其中一格正方形內(nèi)有一只“螞蟻”。
螞蟻的頭部朝向?yàn)?#xff1a;上下左右其中一方。
螞蟻的移動(dòng)規(guī)則十分簡(jiǎn)單:
若螞蟻在黑格,右轉(zhuǎn)90度,將該格改為白格,并向前移一格;
若螞蟻在白格,左轉(zhuǎn)90度,將該格改為黑格,并向前移一格。
規(guī)則雖然簡(jiǎn)單,螞蟻的行為卻十分復(fù)雜。剛剛開(kāi)始時(shí)留下的路線都會(huì)有接近對(duì)稱,像是會(huì)重復(fù),但不論起始狀態(tài)如何,螞蟻經(jīng)過(guò)漫長(zhǎng)的混亂活動(dòng)后,會(huì)開(kāi)辟出一條規(guī)則的“高速公路”。
螞蟻的路線是很難事先預(yù)測(cè)的。
你的任務(wù)是根據(jù)初始狀態(tài),用計(jì)算機(jī)模擬蘭頓螞蟻在第n步行走后所處的位置。
輸入
輸入數(shù)據(jù)的第一行是? m? n? 兩個(gè)整數(shù)(3? < ? m,? n? < ? 100),表示正方形格子的行數(shù)和列數(shù)。?
接下來(lái)是? m? 行數(shù)據(jù)。?
每行數(shù)據(jù)為? n? 個(gè)被空格分開(kāi)的數(shù)字。0? 表示白格,1? 表示黑格。?
接下來(lái)是一行數(shù)據(jù):x? y? s? k,? 其中x? y為整數(shù),表示螞蟻所在行號(hào)和列號(hào)(行號(hào)從上到下增長(zhǎng),列號(hào)從左到右增長(zhǎng),都是從0開(kāi)始編號(hào))。s? 是一個(gè)大寫(xiě)字母,表示螞蟻頭的朝向,我們約定:上下左右分別用:UDLR表示。k? 表示螞蟻?zhàn)叩牟綌?shù)。?
輸出
輸出數(shù)據(jù)為一個(gè)空格分開(kāi)的整數(shù)? p? q,? 分別表示螞蟻在k步后,所處格子的行號(hào)和列號(hào)。
樣例輸入復(fù)制
5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 L 5樣例輸出復(fù)制
1 3解析:
1.定義矩陣的行列,蜘蛛的位置,步數(shù)以及方向
2.定義一個(gè)二維數(shù)組
3.深度遍歷
? ①當(dāng)前步數(shù)=規(guī)定步數(shù),輸出蜘蛛此刻的位置
? ②當(dāng)前位置在白格
? ③當(dāng)前位置在黑格
4.設(shè)定行列數(shù),當(dāng)前位置,要走的步數(shù),方向等
5.實(shí)現(xiàn)深度遍歷函數(shù)?
代碼:
#include<iostream> using namespace std; int m, n, x, y, k; char s; int map[1000][1000]; void Dfs(int x, int y, int cnt, char s) {if (cnt == k){cout << x-1 << "\t" << y << endl;return;}else if (map[m][n] == 1){map[m][n] = 0;if (s == 'L'){Dfs(x - 1, y, cnt + 1, 'U');}else if (s == 'R'){Dfs(x + 1, y, cnt + 1, 'D');}else if (s == 'U'){Dfs(x, y + 1, cnt + 1, 'R');}else if (s == 'D'){Dfs(x, y - 1, cnt + 1, 'L');}}else if (map[m][n] == 0){map[m][n] = 1;if (s == 'L'){Dfs(x + 1, y, cnt + 1, 'D');}else if (s == 'R'){Dfs(x - 1, y, cnt + 1, 'U');}else if (s == 'U'){Dfs(x, y - 1, cnt + 1, 'L');}else if (s == 'D'){Dfs(x, y + 1, cnt + 1, 'R');}} } int main() {cin >> m >> n;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){cin >> map[i][j];}}cin >> x >> y >> s >> k;Dfs(x, y, k, s);return 0; }運(yùn)行結(jié)果:
1480 模擬計(jì)算器(答案錯(cuò)誤82)
題目描述
使用Switch語(yǔ)句編寫(xiě)一個(gè)模擬簡(jiǎn)單計(jì)算器的程序。依次輸入兩個(gè)整數(shù)和一個(gè)字符,并用空格隔開(kāi)。如果該字? 符是一個(gè)“+”,則打印和;如果該字符是一個(gè)“-”,則打印差;如果該字符是一個(gè)“*”,則打印積;如果該字符是“/”,則打印商;如果該字符是一個(gè)? “%”,則打印余數(shù)。打印結(jié)果后輸出一個(gè)空行。
?
輸入
無(wú)
輸出
無(wú)
樣例輸入復(fù)制
3 4 +樣例輸出復(fù)制
7代碼:
#include<iostream> using namespace std;int main() {char ch;int a, b, c;cin >> a >> b >> ch;switch (ch){case '+':c = a + b;break;case '-':c = a - b;break;case '*':c = a * b;break;case '/':c = a / b;break;}cout << c;cout << endl;return 0; }?運(yùn)行結(jié)果:
1481 剪刀石頭布(答案錯(cuò)誤80)?
題目描述
編寫(xiě)程序?qū)崿F(xiàn)“剪刀,石頭,布”游戲。在這個(gè)游戲中,兩個(gè)人同時(shí)說(shuō)“剪刀”,“石頭”或“布”,壓過(guò)另一方的為勝者。規(guī)則是:“布”勝過(guò)“石頭”,“石頭”勝過(guò)“剪刀”,“剪刀”勝過(guò)“布”。要求:選擇結(jié)構(gòu)中使用枚舉類型,結(jié)果的輸出也使用枚舉類型表示。
輸入
兩個(gè)數(shù),范圍為{0,1,2},用空格隔開(kāi)。0表示石頭,1表示布,2表示剪刀。這兩個(gè)數(shù)分別表示兩個(gè)人所說(shuō)的物品。
輸出
如果前者贏,輸出1。如果后者贏,輸出-1。如果是平局,輸出0。?
樣例輸入復(fù)制
0 2樣例輸出復(fù)制
1代碼:
#include<iostream> using namespace std; int main() {int a, b; //0---石頭 1---布 2---剪刀cin >> a >> b;if (a == 0 && b == 1){cout << "-1";}else if (a == 0 && b == 2){cout << "1";}else if (a == 1 && b == 0){cout << "1";}else if (a == 1 && b == 2){cout << "-1";}elsecout << "0"; }?運(yùn)行結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯练习系统[C++]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 惠普暗影精灵6 Air怎么样
- 下一篇: C++11:搞清楚万能引用和右值引用