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

2021-10-04 17:41:49 字數 3900 閱讀 9039

題意:給出乙個n*m的矩陣,找出有如下條件的三角形的個數:

1.三角形的三個頂點均為格點,即橫座標和縱座標均為整數。

2.三角形的面積為1

3.三角形至少有一條邊和x軸或y軸平行。

思路:滿足條件的三角形有兩類:1、底為1,高為2;2、底為2,高為1。

使底邊分別平行於x軸和y軸,其中會有重複的,計算中減去即可。

**

#include

#include

#include

#include

#include

#include

using namespace std;

const

int mod =

1e9+7;

intmain()

簽到題,根據概率算期望

**

#include

#include

#include

#include

#include

#include

using namespace std;

intmain()

簽到題,標記陣列,遍歷找到未被標記的位置

**

#include

#include

#include

#include

#include

#include

using namespace std;

intmain()

for(

int i=

1;i1;i++)}

printf

("%d\n"

,ans)

;return0;

}

題意:給出乙個正整數x,求其因子數,令x等於其因子數,再求x因子數並x等於其因子數,不斷迭代下去,最終x會等於2。求這個過程需要迭代多少次

思路:o( n

\sqrt

n​) 求因子數 模擬過程

for迴圈中i開long long **

#include

#include

#include

#include

#include

#include

using namespace std;

const

int mod =

1e9+7;

intmain()

} n = num;

} cout << ans << endl;

return0;

}

題意:擷取一段最短的連續字串,子串中至少包括k個相同的某個字母

思路:尺取法,,用map儲存了尺取維護的區間中的字母的個數

**

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int mod =

1e9+7;

const

int inf =

0x3f3f3f3f

;int

main()

if(sum < k)

break

; ans =

min(r - l, ans)

; mp[s[l]]-

=1;if

(s[l]

== s[r -1]

) sum -=1

; l +=1

;}if(ans == inf) cout <<-1

<< endl;

else cout << ans

}

題意:乙個 「01」串而言,每次操作可以把 0 字元改為 1 字元,或者把 1 字元改為 0 字元,最多可操作k次。在操作之後找出乙個盡可能長的連續子串,這個子串上的所有字元都相同。

思路:k次操作,只能是全部將0變成1,或者全部將1變成0。全部將0變成1:先移動右端點,遇到0則將可操作次數-1(將0變為1,但不改變真值),如果可操作次數為0,就移動左端點,當左端點遇到0,可操作次數+1,重新迴圈。全部將1變成0,操作相同。兩種可能都執行找出最大值。

**

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int mod =

1e9+7;

const

int inf =

0x3f3f3f3f

;int

main()

r++;}

ans =

max(r - l, ans);if

(r >= n)

break

;while

(s[l]

!='0'

) l++

; num--

; l++;}

//將1變為0

l =0, r =

0, num =0;

while(1

) r++;}

ans =

max(r - l, ans);if

(r >= n)

break

;while

(s[l]

!='1'

) l++

; num--

; l++;}

cout << ans << endl;

return0;

}

題意:給出乙個長度為n字串,「nico」 計a分,「niconi」 計b分,「niconiconi」 計c分。已被計數過的字元不能重複計數,找出最大的計數分數。

思路:線性dp

if (s.substr(i - 3, 4) == 「nico」) dp[i]=max(dp[i],dp[i−4]+a)

if (s.substr(i - 5, 6) == 「niconi」) dp[i]=max(dp[i],dp[i−6]+a)

if (s.substr(i - 9, 10) == 「niconiconi」) dp[i]=max(dp[i],dp[i−10]+a)

**

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int mod =

1e9+7;

const

int inf =

0x3f3f3f3f

;const

int e =

3e5+5;

ll dp[e]

;int

main()

if(i >=

5&& s.

substr

(i -5,

6)=="niconi")if

(i >=

9&& s.

substr

(i -9,

10)=="niconiconi")}

cout << dp[n -1]

<< endl;

return0;

}

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

菜雞乙個,只做出兩道,先掛一下,剩下的會了繼續更 1 小a的計算器 題目描述 小a的數學基礎實在太差了,以至於他只會用計算器算數。他的計算器比較特殊,只有 即加減乘除 四種運算。經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麼。不過幸運的是他記下了整個操作序列,他想請你幫他算出最...

牛客寒假演算法基礎集訓營

首先看到這個題目資料範圍就可以知道這不是乙個可以暴力過的題。所以應該要推乙個結論。我們可以將這個同學的一來一回看成一組,那麼就可以理解為乙個來回中n可以減少n m 1 個人。那麼我們現在要讓所有人都進去,那就是看n m 1 的數量。但是有可能存在一些情況,就是說當你的倒數第二組中的回來的那趟使得n變...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...