王小波曾說:「活下去的訣竅是:保持愚蠢,又不能知道自己有多蠢。」牛客兩道簽到題如下:說實話,我沒想到字串有這麼多考法,今天一開始卡在不能流去空格,又沒臉問,正好媽媽約我逛街,嘿嘿嘿,喪失信心了一會,然後後來撿起來還是ac不了。
f 對答案一時爽
考試結束了,牛牛和牛妹開始對答案。示例1每道題有 abcd 四個選項,一共有道題,全部是單選題,每道題正確得 1 分,錯誤不得分。
牛牛和牛妹互相知道了他們每道題選擇的選項。他們想知道,兩個人得分之和有可能達到的最大值和最小值是多少?
第一行輸入乙個正整數(1≤n≤1001 \leq n \leq 1001≤n≤100)
第二行輸入一行個字元('a'、'b'、'c'、'd'中的一種),用空格隔開。第個字元代表牛牛第題的選項。
第三行輸入一行個字元('a'、'b'、'c'、'd'中的一種),用空格隔開。第個字元代表牛妹第題的選項。
牛牛和牛妹得分之和的能達到的最大值和最小值。用空格隔開。
1
ba
1 0
若正確答案為 a,那麼牛牛分數是 0,牛妹分數是 1,得分之和為 0+1=1。示例2若正確答案為 b,那麼牛牛分數是 1,牛妹分數是 0,得分之和為 1+0=1。
若正確答案為 c,那麼牛牛分數是 0,牛妹分數是 0,得分之和為 0+0=0。
若正確答案為 d,那麼牛牛分數是 0,牛妹分數是 0,得分之和為 0+0=0。
所以他們得分之和的最大值是 1 ,最小值是 0
3
c a c
b d b
3 0
題解**如下:
知識點總結一:cin.get()#include #include using namespace std;
#define ll long long
int n;
int main()
因為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函式一樣,程式的輸入都建有乙個緩衝區,即輸入緩衝區。知識點總結二:getline函式的使用一次輸入過程是這樣的:
當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,
而cin函式直接從輸入緩衝區中取資料。
正因為cin函式是直接從緩衝區取資料的,
所以有時候當緩衝區中有殘留資料時,
cin函式會直接取得這些殘留資料而不會請求鍵盤輸入,
這就是例子中為什麼會出現輸入語句失效的原因!
cin.getline() 與 cin.get(array_name, arsize)的讀取方式相似,getline(cin,array_name,'\n')即輸入方式,陣列名字,結束標誌。以enter結束,可以接受空格字元。
按照長度(arsize)讀取字元, 會丟棄最後的enter字元。
但是這兩個函式是有區別的:
cin.get(array_name, arsize)當輸入的字串超長時,不會引起cin函式的錯誤,
後面的cin操作會繼續執行,只是直接從緩衝區中取資料。
但是cin.getline()當輸入超長時,會引起cin函式的錯誤,
後面的cin操作將不再執行。(具體原因將在下一部分"cin的錯誤處理"中詳細介紹)
知識點總結三:刪除元素方法&stl
(1)remove() & remove_if()
remove原型:
remove_if原型:template< class forwardit, class t >
forwardit remove(forwardit first, forwardit last, const t& value)
前兩個並不是真的刪除,要想真正刪除了應該選取erase函式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"
(2)erase()或者resize()
綜上所述我的理解是:先用cin.get()防止「\n」流失作為後面getline判斷字串結束的標誌。便於用cin輸入簡單的把兩個字串區分(因為直接char字元陣列然後用cin只會讀取乙個字元)string str1 = "text with some spaces";
str1.erase(
std::remove(str1.begin(), str1.end(), ' '), //返回把空格移到後面的第乙個迭代器
str1.end() //刪除兩個迭代器之間的空格
); // ,結果:"textwithsomespaces"
然後又是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 質數這個知識點有很多考法,今年第二次訓練營就有考到 算數基本定理,又稱唯一分解...