模擬演算法例題

2021-10-21 22:42:59 字數 1898 閱讀 8204

一、火柴棒

題目描述

給你n根火柴棍,你可以拼出多少個形如「a+b=c」的等式?等式中的a、b、c是用火柴棍拼出的整數(若該數非零,則最高位不能是0)。用火柴棍拼數字0-9的拼法如圖所示:

注意:

1、加號與等號各自需要兩根火柴棍

2、如果a≠b,則a+b=c與b+a=c視為不同的等式(a、b、c>=0)

3、n根火柴棍必須全部用上

分析:1、輸入的n根火柴需全部用上,代表所有的數字、符號所用的火柴棒必須等於n;

2、因為加號與等號各需兩根火柴棒,所以數字所用的火柴棒為n-2;

3、想拼成乙個數字最少需要兩根火柴棒,所以兩個加數均不會超過1111。

具體步驟

1、輸入n,隨後對你,進行預處理(減等四)

int n;

cin>>n;

n-=4;

2、定義陣列bang,前十個元素存入十個數字各自需要的火柴數

int bang[

2233]=

;

3、進行迴圈:從10開始,結束到2222(後文會說為什麼是2222),算出每個數所需的火柴棒根數

for

(int i=

10;i<=

2222

;i++

)

4、雙重迴圈,一重列舉第乙個加數,二重列舉另一加數,(開頭均為0,結尾均為1111,這就是為什麼要算到第2222個數的火柴根數的理由了)再定義乙個數等於總根數除去這兩個加數的火柴根數。最後進行比較、輸出。**不再給出。

二、破碎的項鍊

題目描述

你有一條由n個紅色的,白色的,或藍色的珠子組成的項鍊(3<=n<=350),珠子是隨意安排的。 這裡是 n=29 的二個例子:

第一和第二個珠子在中已經被作記號。 a 中的項鍊可以用下面的字串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 假如你要在一些點打破項鍊,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到乙個不同的顏色珠子,在另一端做同樣的事。(顏色可能與在這之前收集的不同) 確定應該在**打破項鍊來收集到最大多數的數目的子。 example 舉例來說,在 a 中的項鍊,可以收集到8個珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之間打斷項鍊。 在一些項鍊中,包括白色的珠子如 b 所示。 當收集珠子的時候,乙個被遇到的白色珠子可以被當做紅色也可以被當做藍色。 表現項鍊的字串將會包括三符號 r , b 和 w 。 寫乙個程式來確定從一條被**的項鍊最大可以被收集珠子數目。

分析:1、考慮環形的特殊情況;

2、顏色為white(w)時的特殊判定;

3、找最優解,即兩頭連續數目最多的乙個切法。

具體做法

1、定義乙個陣列或字串(我用的陣列),陣列大小開到750(因為是環形,想要做到選出最優解就要乙個乙個試起點,所以要開到最大數的兩倍還多);

2、輸入陣列,對陣列進行預處理,讓陣列首尾相連;

3、int四個累加器,乙個主要的,乙個專門處理w,另兩個,乙個從頭到尾,乙個從尾到頭,再char兩個變數,乙個作為開頭字元,另乙個作為結尾字元;

**4、(最重要的)**開迴圈,一重迴圈先判斷有沒有全是w的情況,將w的個數特判一下,如果符合全是w,輸出累加器,否則總累加器等於w的個數;隨後接兩個迴圈,乙個從尾到頭查詢,另乙個從頭到尾查詢(一定要特判開頭結尾是不是w),分別累加數量;

5、比較總累加器與這兩個小累加器的和哪個大,輸出大的那個。

Dijkstra演算法 例題

dijkstra演算法 從起點到終點求最短路 使用要求權值為正 1 求短路i 題目 點數 500 邊數 1e5 include include include using namespace std const int n 510,m 1e5 10 時間複雜度o n m int n,m 鄰接矩陣 i...

manacher演算法 例題

簡單而有通俗的講解,講的太好了 證明對於一些我的理解,我會以 注釋的形式寫在 裡,我不懶 char str maxn char temp maxn 1 10 擴充套件後的字串 int len maxn 1 10 擴充套件後字串第i個位置回文串從中間到第有邊界的長度 相當於 回文子串長度 2 1 在用...

遞推演算法例題

例1 植樹節那天,有五位同學參加了植樹活動,他們完成植樹的棵樹都不相同,問第一位同學植了多少棵樹時,他指著旁邊的第二位同學說比他多植了兩棵 追問第二位同學他又說比第三位同學多植了兩棵,如此追問,都說比另一位同學多植兩棵。最後問道第五位同學時,他說自己種了10棵,問第一位同學植了多少棵?分析 設第一位...