洛谷 基礎 遞推與二分筆記

2021-09-25 18:55:47 字數 3456 閱讀 7344

p1025 數的劃分

p1057 傳球遊戲

p1216 數字三角形

p1182 數列分段 section ii

p1316 丟瓶蓋

有n級的台階,你一開始在底部,每次可以向上邁最多k級台階(最少11級),問到達第n級台階有多少種不同方式。

兩個正整數n,k。

乙個正整數,為不同方式數,由於答案可能很大,你需要輸出ans % 100003後的結果。

​ 這個是典型的遞推思路,類似於斐波拉契數列

#includeusing namespace std;

int n,m;

long long ans[100008];

int main()

ans[i] = (ans[i] + ans[i - j])%100003;

} }cout將整數n分成k份,且每份不能為空,任意兩個方案不相同(不考慮順序)。

例如:n=7,k=3,下面三種分法被認為是相同的。

1,1,5;

1,5,1;

5,1,1.

問有多少種不同的分法。

n( 所屬區間(6,200] ),k( 所屬區間[2,6])

1個整數,即不同的分法。

​ 使用組合數學思想,形成乙個動態規劃遞推式

至少有乙個盒子只有乙個小球的情況數

.沒有乙個盒子只有乙個小球的情況數

#includeusing namespace std;

//動態規劃

//分倆種情況

int n,k;

int f[205][8];

int main()

for (int i=2;i<=n;i++)

else

} }cout上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。

遊戲規則是這樣的:n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同學就是敗者,要給大家表演乙個節目。

聰明的小蠻提出乙個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裡開始傳的球,傳了m**次以後,又回到小蠻手裡。兩種傳球方法被視作不同的方法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有三個同學1號、2號、3號,並假設小蠻為1號,球傳了3次回到小蠻手裡的方式有1->2->3->1和1->3->2->1,共2種。

一 行,

有兩個用

空格隔開

的整數n

,m。(

3<=n

<=30

,1<=m

<=30

)一行,有兩個用空格隔開的整數n,m。(3 <= n <= 30,1 <= m <= 30)

一行,有兩個

用空格隔

開的整數

n,m。

(3<=n

<=3

0,1<=m

<=3

0)1個整數,表示符合題意的方法數。

​ 一開始,我使用簡單的遞迴,發現超時大部分資料點

​ 然後使用動態規劃 (更像當於是遞推)

#includeusing namespace std;

int n,m;

int ans;

/* 50分基礎遞迴

void solve(int step,int now)

if(now == n + 1)

if(step == m)

return;

} else

}int main()

f[n][k] = f[1][k - 1] + f[n - 1][k - 1];

} cout觀察下面的數字金字塔。

寫乙個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。

7388102

7444

5265

在上面的樣例中,從7 到 3 到 8 到 7 到 5 的路徑產生了最大

第乙個行包含 r(1<= r<=1000) ,表示行的數目。

後面每行為這個數字金字塔特定行包含的整數。

所有的被**的整數是非負的且不大於100。

單獨的一行,包含那個可能得到的最大的和

​ 動態規劃,為了方便動態,採取從金字塔底部向上的做法

最大值最小化,最小值最大化 - 二分法+貪心

#includeusing namespace std;

int n,m;

int a[100008];

int imax(int x,int y)

int lef;

int rig;

int total = 0;

int tim = 0;

int ans = 0;

bool judge(int x,int a)

int main()

//cout<

//return 0;

while(lef<=rig)

else

}cout陶陶是個貪玩的孩子,他在地上丟了a個瓶蓋,為了簡化問題,我們可以當作這a個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出b個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?

第一行,兩個整數,a,b。(b<=a<=100000)

第二行,a個整數,分別為這a個瓶蓋座標。

僅乙個整數,為所求答案。

最小值最大化問題 -> 二分法 + 貪心

其實,最主要的**部分就是judge函式的編寫

至於最後答案的輸出,可以嘗試一下,來對比獲得.

#include#includeusing namespace std;

int a,b;

int p[100008];

int ans;

bool judge(int limit)

} if(total >= b)

else

} int main()

sort(p+1,p+a+1);

int l = 1;

int r = p[a] - p[l];

while(l<=r)

else

} cout<

return 0;

}

洛谷 1057 傳球遊戲(遞推與遞迴二分)

題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出...

洛谷二分答案問題

二分答案關鍵有2點 1.怎麼寫judge函式,其實就是根據題意想辦法判斷我們列舉的這個答案是否可行 合法 2.找到了乙個可行解 合法的,超過題目限制是不合法 再往左邊還是右邊查詢看是否有更優的解是個問題,需要好好想想。這兩點想明白了,二分就會異常簡單甚至比暴力列舉還要簡單。因為暴力列舉你還要考慮 0...

洛谷1182 1336 二分答案技巧

題目傳送門 今天真是令人悲傷的一天,寫什麼都寫不出來,本來想找點st表的題做,在找題的路上意外看到了網路流,想到自己網路流完全不行就想研究這個,為了研究網路流,我想先去研究我同樣薄弱的bfs,於是又遇到了我的一生之敵八數碼,想把八數碼解決就先練一下字串雜湊,結果就是直到現在,一事無成,只能說如下圖 ...