菜鳥簽到題 牛客演算法基礎訓練營第一日有感

2021-10-18 16:41:15 字數 4667 閱讀 2168

王小波曾說:「活下去的訣竅是:保持愚蠢,又不能知道自己有多蠢。」

說實話,我沒想到字串有這麼多考法,今天一開始卡在不能流去空格,又沒臉問,正好媽媽約我逛街,嘿嘿嘿,喪失信心了一會,然後後來撿起來還是ac不了。

牛客兩道簽到題如下:

f 對答案一時爽

考試結束了,牛牛和牛妹開始對答案。

每道題有 abcd 四個選項,一共有道題,全部是單選題,每道題正確得 1 分,錯誤不得分。

牛牛和牛妹互相知道了他們每道題選擇的選項。他們想知道,兩個人得分之和有可能達到的最大值和最小值是多少?

第一行輸入乙個正整數(1≤n≤1001 \leq n \leq 1001≤n≤100)

第二行輸入一行個字元('a'、'b'、'c'、'd'中的一種),用空格隔開。第個字元代表牛牛第題的選項。

第三行輸入一行個字元('a'、'b'、'c'、'd'中的一種),用空格隔開。第個字元代表牛妹第題的選項。

牛牛和牛妹得分之和的能達到的最大值和最小值。用空格隔開。

示例1

1

ba

1 0
若正確答案為 a,那麼牛牛分數是 0,牛妹分數是 1,得分之和為 0+1=1。

若正確答案為 b,那麼牛牛分數是 1,牛妹分數是 0,得分之和為 1+0=1。

若正確答案為 c,那麼牛牛分數是 0,牛妹分數是 0,得分之和為 0+0=0。

若正確答案為 d,那麼牛牛分數是 0,牛妹分數是 0,得分之和為 0+0=0。

所以他們得分之和的最大值是 1 ,最小值是 0

示例2

3

c a c

b d b

3 0
題解**如下:

#include #include using namespace std;

#define ll long long

int n;

int main()

知識點總結一:cin.get()

因為cin是不將「\n」作為字串內容作為儲存的,所以我們使用cin.get()。其作用為在輸入流佇列中保留回車。

詳細情況如下(選自部落格:

該函式有三種格式:無參,一引數,二引數

即cin.get(),  cin.get(char ch),  cin.get(array_name, arsize)

讀取字元的情況:

輸入結束條件:enter鍵

對結束符處理:不丟棄緩衝區中的enter

cin.get() 與 cin.get(char ch)用於讀取字元,他們的使用是相似的,

即:ch=cin.get() 與 cin.get(ch)是等價的。

找了一些話,關於我以前的**為什麼無法正常儲存第乙個字元以及字尾許多「燙」亂碼。

與scanf函式一樣,程式的輸入都建有乙個緩衝區,即輸入緩衝區。

一次輸入過程是這樣的:

當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,

而cin函式直接從輸入緩衝區中取資料。

正因為cin函式是直接從緩衝區取資料的,

所以有時候當緩衝區中有殘留資料時,

cin函式會直接取得這些殘留資料而不會請求鍵盤輸入,

這就是例子中為什麼會出現輸入語句失效的原因!

知識點總結二:getline函式的使用

cin.getline() 與 cin.get(array_name, arsize)的讀取方式相似,

以enter結束,可以接受空格字元。

按照長度(arsize)讀取字元, 會丟棄最後的enter字元。

但是這兩個函式是有區別的:

cin.get(array_name, arsize)當輸入的字串超長時,不會引起cin函式的錯誤,

後面的cin操作會繼續執行,只是直接從緩衝區中取資料。

但是cin.getline()當輸入超長時,會引起cin函式的錯誤,

後面的cin操作將不再執行。(具體原因將在下一部分"cin的錯誤處理"中詳細介紹)

getline(cin,array_name,'\n')即輸入方式,陣列名字,結束標誌。

知識點總結三:刪除元素方法&stl

(1)remove() & remove_if()

remove原型:

template< class forwardit, class t >

forwardit remove(forwardit first, forwardit last, const t& value)

remove_if原型:

remove_if(beg, end, op);

// example

bool isspace(char x)

string str2 = "text with some spaces";

// 處理前:"text with some spaces"

str2.erase(remove_if(str2.begin(), str2.end(), isspace), str2.end());

// 處理後:"textwithsomespaces"

前兩個並不是真的刪除,要想真正刪除了應該選取erase函式

(2)erase()或者resize()

string str1 = "text with some   spaces";

str1.erase(

std::remove(str1.begin(), str1.end(), ' '), //返回把空格移到後面的第乙個迭代器

str1.end() //刪除兩個迭代器之間的空格

); // ,結果:"textwithsomespaces"

綜上所述我的理解是:先用cin.get()防止「\n」流失作為後面getline判斷字串結束的標誌。便於用cin輸入簡單的把兩個字串區分(因為直接char字元陣列然後用cin只會讀取乙個字元)

然後又是erase加上remove_if我想的可能是用後者把空格挑出來??然後用erase刪掉空格便於後期對比字串中不同字元個數。

b 括號

請你構造乙個非空的括號字串,包含正好 k 個不同合法括號對。

所謂括號字串,是指由'('和')'這兩種字元構成的字串。

要求構造的字串長度不超過100000。

乙個整數 k。(0示例1

3
()()
假設字串陣列下標從 1 開始,則 (1,2), (1,4), (3,4) 共計 3 個合法括號對

當然,"()))" 也是一種合法的構造

示例2

4
(())
假設字串陣列下標從 1 開始,則 (1,3), (1,4), (2,3), (2,4) 共計 4 個合法括號對

另外,合法的構造還有"())()"、"()(()(" 等等。。

示例3

9
()))))))))
合法的還可以是:

等等等。。有非常多種合法構造,輸出任意即可。

解題思路:

找出k的因子並且選出差最小的一對。

如平方數

4(());

9((()));

16(((())));

如非質數

(((())))))(4×6)

((((((())))))))(7×8)

質數則需要特別處理

7=4+3;

#includeusing namespace std;

int main()

else {

int p=sqrt(n);

int c=n/p,y=n%p;

for(i=0;i

則我們需要兩個式子來求最接近的兩個因子:先將k開方,然後借助n/p和n%p求出兩個因子即可;

牛客寒假演算法基礎訓練營6

早知道這次題目這麼簡單就認真做了,最後一場沒心做,後面懶得想了,唉罪過罪過 1 煤氣灶 題目描述 小j開始打工,準備賺錢買煤氣灶。第一天,小j的工資為n元,之後每天他的工資都比前一天多d元。已知煤氣灶需要m元,求小j最少工作幾天才能買到煤氣灶。輸入描述 四個整數 n,m,d,x 分別表示小j第一天的...

牛客寒假演算法基礎訓練營1 G

這道題的題解講的非常好了已經,對於1 n數的排列子區間 l,r 使得區間中的數滿足連續的條件為 r l max a l r min a l r l,r為下標 既然要使 l,r 為萌區間,那麼就要找到這個區間內的最大值mx與最小值mn,判斷是否滿足條件 若不滿足條件,那麼需要將 mn,mx 缺少的數字...

牛客演算法基礎訓練營2 質數的不同考法

歌德說 了解自己最好的方式,不是沉思,而是行為。質數這個東西就是,你知道他是什麼,但是每次換個考法你就不會了。首先,日常判斷質數的 最初耗時最長 bool isprime int x bool isprime int x 質數這個知識點有很多考法,今年第二次訓練營就有考到 算數基本定理,又稱唯一分解...