2021寒假集訓Part 1

2021-10-17 21:35:46 字數 4337 閱讀 1023

鞏固演算法筆記第四章

2021寒假集訓part 1

2021-01-24 25 26

題單由此進!!!

以下只記錄個人覺得有意思的

1 p1177 【模板】快速排序

#

include

using namespace std;

int n,a[

1000001];

void

qsort

(int l,

int r)

//應用二分思想

}while

(i<=j)

;//這裡注意要有=

if(lqsort

(l,j)

;//遞迴搜尋左半部分

if(iqsort

(i,r)

;//遞迴搜尋右半部分

}int

main()

理解後自己盲打的** 也過oj了

#

include

int a[

10010];

int n;

void

qsort

(int l,

int r)

while

(a[j]

>mid)

if(i<=j)}if

(lif(i}int

main()

qsort(1

,n);

for(

int i=

1;i<=n;i++

)return0;

}

感覺相對於書上的快速排序 如上的快排會快一點 因為他是從兩頭判斷 而傳統的是從一頭判斷 不滿足條件後再互換值 效率明顯低 另外注意遞迴 注意遞迴 注意遞迴 重要的事情說三遍!!!

2 p1012 [noip1998 提高組] 拼數

#

include

#include

#include

#include

using namespace std;

string a[25]

;bool cmp

(string a,string b)

intmain()

sort

(a,a+n,cmp)

;for

(int i=

0;i)return0;

}

此題題意就是把開頭數字大的數字放前面 比如 『12345』 與 『9』 『9』應該放前面 但是對於321 與32

顯然32應該放前面 此時應該想到string 利用string的加法直接可比較 即

bool cmp

(string a,string b)

簡單暴力!

3 p1036 [noip2002 普及組] 選數

#

include

#include

using namespace std;

bool isprime

(int a)

int n,k;

int a[25]

;long

long ans;

void

dfs(

int m,

int sum,

int startx)

for(

int i = startx; i < n; i++

)dfs

(m +

1, sum + a[i]

, i +1)

;//遞迴

//步數要加一,和也要加

//公升序起始值要變成i+1,以免算重

return

;//這乙個步驟下,所有的都列舉完了

//直接返回去

}int

main()

自己再重新敲一遍

#

include

int a[25]

,ans=

0,n,k;

bool isprime

(int x)

for(

int i=

2;i*i<=x;i++)}

return true;

}voids(

int m,

int sum,

int up)

}for

(int i=up;i)return;}

intmain()

s(0,

0,0)

;printf

("%d"

,ans)

;return0;

}

感覺遞迴還是難啊~

4 p1024 [noip2001 提高組] 一元三次方程求解

#

include

double a,b,c,d;

doublef(

double x)

intmain()

if(x1*x2<0)

else

}printf

("%.2f "

,mid)

; s++;}

if(s==3)

}return0;

}

談幾點

函式一定要是double型 自己被坑了深有感觸 不要隨手就int型

類似這種求解題一定要判斷端點 且只判斷左端點或者右端點避免重複

確定精確度的時候可利用 l r 確定 不一定非要用f(x)確定

5 p2043 質因子分解

#

include

int a[

10010];

intmain()

}}for(

int i=

2;i<=n;i++)}

return0;

}

以上暴力寫法 網上看到很多人判斷是否是素數進行處理後再找因子 **冗長 用以上暴力寫法思路明了 但是會做許多無用功 因此可以改進插入對i2是否是素數的判斷以提前跳出迴圈 改進後暴力寫法如下

#

include

int a[

10010];

bool isprime

(int x)

for(

int i=

2;i*i<=x;i++)}

return true;

}int

main()

if(isprime

(i2))}

}for

(int i=

2;i<=n;i++)}

return0;

}

同樣ac

6 cf909a generate login

#

include

#include

intmain()

else

}printf

("%c"

,b[0])

;return0;

}

實現不難 主要學習一下貪心的思路

我們首先先輸出第乙個串的第乙個字元,因為要求非空。 我們注意到無論如何,第二個串只需要乙個字元即可,因為長度短的串字典序小。如果加上第二個字元一定會使字典序更大。

例如:***xp字典序比***x大。無論***x後面加上什麼字元,字典序都比原串大。

然後我們每次判斷,如果第乙個串中的剩餘的當前字元仍然比第二個串的首字元小,那麼總字典序肯定也比直接加上後乙個串的長度小。 當我們發現乙個串中字元字典序\ge≥第二個串的首字元,那麼我們直接輸出第二個串首字元,然後結束程式即可。

7 p1116 車廂重組

兩種思路

第一種思路 即為氣泡排序

#

include

int a[

10010];

intmain()

for(

int i=

1;i<=n-

1;i++)}

}printf

("%d"

,ans)

;return0;

}

第二種思路為迭代

只是迭代去計算每個數字前有幾個數字比它大,這意味著它必須要移動幾次。

#

include

using namespace std;

int n, sum;

intmain()

願每次回憶,對生活都不感到負疚。——郭小川

雅禮集訓 part1

目錄day2 市場實際上算上區間加法增長的部分值域也很低,對於區間整除最多做 log 次。所以直接線段樹暴力維護。記錄 矩陣為什麼我會預設可以用列給行染色啊?只能先搞出一行全黑,然後染完所有列。由於是給列染色,所以對於第 k 行,只要存在某一行的第 k 列是黑,就可以完成補色,且補色的步數一定。對於...

部落格推薦 Part 1

部落格推薦 part 1 博起 了一年多了,寫過一百多篇博文,看過的博文更是不計其數。剛剛看到乙個部落格的文章,實在把我笑到不行。然後就想推薦給大家。繼而就心血來潮,想把自己喜歡的一些部落格陸續的推薦給大家。也許,你也會喜歡呢?說明 仙仙,本名張仙!是湖南的一位autoware兄弟,跟我一起混跡內蒙...

C Handle 控制代碼 part1

本文是我學習c 沉思錄第6章的筆記 本文主要講述了handle類的概念,定義方法以及寫時複製技術。在前文 surrogate 類 的講解中我們了解到了 的實現方法.類有很多好處,但是麻煩的是每次都得進行複製.如果該類是經常使用並且member很多的話,這樣複製的消耗是十分客觀的.因此這裡就要介紹另外...