刷題知識點總結(C )

2021-10-06 12:30:02 字數 3982 閱讀 2689

string中尋找子串、替換字串

string字串判斷是否被訪問過

部分揹包問題通式

區間貪心

哈夫曼樹

將char字元變成int

向下取整和向上取整

當使用二維陣列超時的時候,可以使用二維map

lower_bound( )和upper_bound( )

set:: iterator tp;

遇到有關圖的題時,鄰接表還是鄰接矩陣

二維陣列或者vector可以單獨對第二維進行sort排序

當re的時候,不妨再擴大一下maxn的值

當只用dfs一次,只需要得到乙個方案時

加快for迴圈速度

exit(0)

不要題中n給多大,maxn就設定多大

記憶化搜尋

fill初始化二維陣列(非-1/0)

當遇到輸入為「-100 blabla bla」 【兩個char】

int的取值範圍為: -231——231-1,即-2147483648——2147483647,如果題目中輸入的整數不超過1,000,000,000都可以使用int型變數。

當題目中要求,輸入為多組測試資料,每行一組時,使用:

int

main()

return0;

}

需要加上str.c_str()

int

main()

使用::toupper轉大寫,使用tolower轉小寫

int

main()

當遇到相同資料都按先錄入排列在前的規則處理時,排序不能使用sort(),只能使用stable_sort()。

如果查詢不到子串會返回string::npos。

map.find(key)可以查詢map中的鍵key對應的對映的迭代器。

queue通過不斷迴圈來pop()

while

(!q.

empty()

) q.

pop(

);

string s;

while

(getline

(cin,s)

)

使用getline(cin,s)來輸入一行中間還有空格的字串

不然cin>>s 會以空格隔開輸入

%-5d-——左對齊

memset(g,-1/0,sizeof(g);

如果求方案數,使用dfs,不能用bfs。

如果求步數,可以使用bfs。

int

dfs(

int t)

else}}

}

void

bfs(

int start)

}

str.find(substr)!=string::npos此時可以在str中找到substr子串

str.replace(pos,len,str2)把str從pos號位開始,長度為len的子串替換為str2.

使用set< string > vis;

如果vis.count(str) == 0則說明沒有出現過str子串,否則就是重複的,之後再把str放入set:vis.insert(str)

因為set集合中元素不會重複

注意這類問題的通式:

先宣告乙個結構體來存重量,價值和單位價值。

讀入資料後,計算每類物品的單位價值,然後按單位價值從高到低排序

之後迴圈所有物品,每次選擇單價最高的物品,如果重量<=揹包:將該物品所有全部裝入;如果重量》揹包,將單價*揹包容量的裝入。

排序cmp規則:

比較左端點座標不同,則大的在前;相同,則按右端點小的在前

bool

cmp(contest x, contest y)

使用優先佇列來存放結點,因為優先佇列可以保持時刻佇列中都是有序的。

//設定優先順序佇列,值越小優先順序越高 

priority_queue<

int,vector<

int>

,greater<

int>

> q;

//存放果子

string s;

int a;

a[i]

= s[i]

-'0'

;

floor(double x); ——向下取整

ceil(double x); ——向上取整

使用floor函式。floor(x)返回的是小於或等於x的最大整數。

如:floor(10.5) == 10 floor(-10.5) == -11

使用ceil函式。ceil(x)返回的是大於x的最小整數。

如:ceil(10.5) == 11 ceil(-10.5) ==-10

map> mmap;

lower_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第乙個大於或等於num的數字,找到返回該數字的位址,不存在則返回end。通過返回的位址減去起始位址begin,得到找到數字在陣列中的下標

upper_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第乙個大於num的數字,找到返回該數字的位址,不存在則返回end。通過返回的位址減去起始位址begin,得到找到數字在陣列中的下標

*tp可以取tp迭代器所指的值

當題目中提到頂點的個數為105 數量級時,此時使用鄰接矩陣(g[maxn][maxn])存圖明顯會超時,所以應該用鄰接表存圖(vector< node > adj[maxn])

for

(int i=

1;i<=n;i++

)

使用乙個flag標誌位,在遞迴邊界裡將flag置為true,同時在dfs函式開頭要加上判斷flag的語句,這樣才不會導致回溯時把原方案覆蓋。

void

dfs(

int last,

int step)

return;}

········

}

把後面的i++,變為++i,此時對迴圈並沒有影響,同時加快了速度

可以在子函式中使用exit(0);來使呼叫子函式時,結束時直接退出,而不是再次執行下面的主函式程式。

這樣有時候會出現re或者tle

當n<105,不妨設定maxn=1000010

記憶化搜尋,用來減少搜尋次數,防止超時

每次搜尋記錄下來已經已經搜尋過的點的值,下次搜到這個點,直接用已經求過的值即可。

用s陣列存放記憶

int

dfs(

int x,

int y)

fill(dp[0],dp[0]+maxn*maxn,inf);

在使用scanf("%s",a)讀取第乙個字串的時候,要先使用getchar()吸收空格,然後再使用gets(b)讀取第二個帶空格的字串

當帶空格的字串無法使用gets時,可以使用cin.getline(str,length)來讀入

C 刷題知識點總結1

1.表示式1 4 2.75的值是3。請問這個說法是正確的嗎?沒有說明型別,假如是整型,則答案為2.若是浮點型,答案為3 2.strlen 計算字元陣列的字元數,以 0 為結束判斷,不計算為 0 的陣列元素。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。3.不...

C 刷題知識點總結3

int p 10 p是乙個陣列 含10個int元素 int p 10 p是乙個指標 指向乙個有10個int的陣列 2.c primer 中文版p187 190關於引數傳遞,指出只有傳值和傳引用 傳指標包含在傳值裡 一般來說,c裡面有兩種傳遞 1 值傳遞 2 指標傳遞 嚴格來看,只有一種傳遞,值傳遞,...

刷題知識點

加速輸入輸出流,放到 頭部 static const auto speedup 陣列初始化容器 int a vector b begin a end a map操作 include include using namespace std int main void else 刪除 iterator ...