來自PTA Basic Level的三隻小野獸

2021-10-02 06:45:04 字數 2853 閱讀 6916

最近利用閒暇時間做了一下 pta basic level 裡的題,裡面現在一共有 95 道題,這些題大部分很基礎,對於刷倦了 leetcode 的小夥伴可以去裡面愉快的玩耍哦。

請聽題:

題目描述

給定乙個英語句子,各個單詞之間用空格分隔。要求你編寫程式,將句中所有單詞的順序顛倒輸出。

輸入示例

hello world here i come

輸出示例

come i here world hello

沒騙你吧,是不是很簡單。這道題我們確實可以很容易的解決,但你的思路是什麼呢?你設計的演算法很完美麼?

相信會有一部分小夥伴的思路是這樣滴:

首先string來儲存輸入的句子,再split分隔提取單詞,將單詞儲存在vector中,最後倒序輸出。

vector

split

(string sentence)

intmain()

return0;

}

這樣沒毛病哈,我第一次就是這麼幹的。但對於這種簡單題,這樣做顯得太麻煩了,然後我在網上看到了這段**:

int

main()

return0;

}

當時真的驚豔到我了,上面**充分利用了cin以空格分隔各個變數輸入的特點,直接提取到了各個單詞。

之後巧妙利用棧後進先出的特點,將單詞依次壓入stack,最後再依次彈出,就得到了逆序的單詞序列,這兩行**用的著實巧妙!

題目描述

據說天文學家愛丁頓為了炫耀自己的騎車功力,定義了乙個「愛丁頓數」 e

ee ,即滿足有 e

ee 天騎車超過 e

ee 英里的最大整數 eee。

現給定某人 n

nn 天的騎車距離,請你算出對應的愛丁頓數 e(≤

n)

e(≤n)

e(≤n)。

輸入第一行給出乙個正整數 n(≤

105)

n (≤10^5)

n(≤105

),即連續騎車的天數;第二行給出 n 個非負整數,代表每天的騎車距離。

在一行中輸出 n 天的愛丁頓數。

輸入示例

6 7 6 9 3 10 8 2 7 8

輸出示例

看到 n(≤

105)

n (≤10^5)

n(≤105

) 我以為不能暴力求解,但旺旺沒想到,暴力竟然也能過。首先我們來看一下暴力思路是咋樣的。

通過題目我們可以確定 e

ee 的取值範圍是0 ~ n,也就是說我們要在0 ~ n中搜尋乙個符合條件的盡可能大的數。

暴力思路就是這樣的:

for

(int i = n; i >=

0; i--

)}

這個時間複雜度是 on2

o_on

2​,因為外層for的遍歷需要 n

nn,判斷每個 i

ii 是否符合條件也需要 nnn。

要優化其實也很簡單。既然是要在0 ~ n的空間中搜尋,而且0 ~ n也是單調的,那正好符合二分的使用條件。我們就可以用二分來代替第一層for迴圈,這樣時間複雜度就是 o(n

logn

)o_

o(nlog

n)​ 了。

二分優化後的**:

// 判斷k是否符合條件

bool

isok

(int k,

int a,

int n)

intmain()

cout << r;

return0;

}

像這種使用二分優化搜尋空間的題型 leetcode 上也有很多,比如 875. 愛吃香蕉的珂珂,1011. 在 d 天內送達包裹的能力,1231. 分享巧克力,對這塊不熟悉的小夥伴可以去做做。

題目描述

給定若干段繩子,你需要把它們串成一條繩。每次串連的時候,是把兩段繩子對折,再套接在一起。這樣得到的繩子又被當成是另一段繩子,可以再次對折去跟另一段繩子串連。每次串連後,原來兩段繩子的長度就會減半。

給定 n

nn 段繩子的長度,你需要找出它們能串成的繩子的最大長度。

輸入示例

10 15 12 3 4 13 1 15

輸出示例

經典演算法中有兩類演算法特別考驗解題思維,一是動態規劃,二是貪心思想。

這道題就是一道簡單的貪心題。根據題目的意思,我們需要找到一種串連方式,使得最終得到的繩子的長度最長,也就是使得 n

nn 段繩子損失的長度最小。

那麼如何盡可能減小繩子長度的損失呢?每次盡可能的選用短繩對折連線,從而避免長繩對折,採用這種方式進行連線繩子長度損失是最小的。

在程式中我們可以使用優先佇列priority_queue讓隊首元素保持值最小,**如下:

int

main()

while

(q.size()

>1)

cout << q.

top();

return0;

}

對貪心不熟悉的小夥伴可以看看這篇文章:初識貪心思想。

這三道題不會很難吧,但要寫出令人眼前一亮的**不僅要有紮實的演算法基礎,還要能夠靈活的使用資料結構。所以在做題的時候要多思考,多總結!

今天是小年,祝大家小年快樂!

PTA Basic Level 1048 數字加密

本題要求實現一種數字加密方法。首先固定乙個加密用正整數 a,對任一正整數 b,將其每 1 位數字與 a 的對應位置上的數字進行以下運算 對奇數字,對應位的數字相加後對 13 取餘 這裡用 j 代表 10 q 代表 11 k 代表 12 對偶數字,用 b 的數字減去 a 的數字,若結果為負數,則再加 ...

PTA Basic Level 1028 人口普查

某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入...

PTA Basic Level 1027 列印沙漏

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...