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

2021-10-25 22:28:42 字數 3530 閱讀 3880

c.重力墜擊

題解:1.深搜。注意要避免某些圓被多次相交時重複計數的情況。

2.暴力。列舉每個圓心相交的圓的數量,存到降序排列的優先佇列中,取前k個即可。

#include

using

namespace std;

struct node

a[20

], pos[20]

;int n, k, r;

int mx;

bool

xiangjiao

(int i,

int j)

//判斷第i個圓和第j個選擇的圓是否相交

intcalc()

}return cnt;

}void

dfs(

int step)

for(

int i =-7

; i <=

7; i++

)//圓心的位置可以有15*15種嘗試

for(

int j =-7

; j <=

7; j++)}

intmain()

在這裡插入**片
f.匹配串

題解:第一眼看著挺麻煩,但仔細分析後其實也不難。首先明確答案只有0和無窮大個,只要能匹配上乙個,『#』不斷新增,就能匹配上無數個。然後,當乙個字串兩端被『#』圍起來的時候,這部分就任意取了,當作沒有。那麼關鍵就在於第乙個『#』前的字串和最後乙個『#』後的字串,而這些字串是其最長字串的字首或字尾,逐一比較新增即可。

#include

using

namespace std;

char s[

1000010];

char qian[

1000010

], hou[

1000010];

bool

judge()

int lh =

strlen

(hou)

;for

(int i = l -

1, j =

0; i >=

0&& s[i]

!='#'

; i--

, j++

)return1;

}int

main()

if(flag)

printf

("-1\n");

else

printf

("0\n");

}

g.糖果

題解:並查集確定好各個集合,每個集合中的每個元素的值為這個集合中最大元素的值。

#include

using

namespace std;

int a[

1000010

], f[

1000010];

int n, m;

void

init()

intfind

(int x)

void

union

(int x,

int y)

}int

main()

long

long res =0;

for(

int i =

1; i <= n; i++

) res +

= a[

find

(i)]

;printf

("%lld\n"

, res)

;}

h.數字串

題解:兩位換一位,其中第一位只能是a或b,第二位如果第一位是a只能是a-i,如果第一位是b只能是a-g;一位換兩位,對應數字大於10且不等於20。題目要求長度不超過2e6,那麼換一次即可。

#include

using

namespace std;

char s[

1000010];

int vis[

1000010];

intmain()

}if(flag)

printf

("\n");

return0;

}char ans1, ans2;

//一位換兩位

for(i =

0; i < l; i++)}

if(flag)

printf

("\n");

}else

printf

("-1\n");

}

i.序列的美觀度

題解:方法一:

設dp[i]為長度為i的序列的最大美觀度,第i位分兩種情況:

1.沒放或放了但沒做貢獻 dp[i]=dp[i-1]。

2.放了且做出貢獻,dp[i]=dp[last[ a[i] ] ]+1,把第i位放到上一次出現的位置後面。

方法二:

貪心。找到一對就計數一次,然後把這前面的數都刪掉,因為前面的數不能配對。

#include

using

namespace std;

int a[

1000010];

int last[

1000010];

int dp[

1000010];

intmain()

printf

("%d\n"

, dp[n]);

}

#include

using

namespace std;

int a[

1000010];

intmain()

mp[a[i]]=

1;}printf

("%d\n"

, res)

;}

j. 加法和乘法

題解:當牛妹執行最後一次的時候,因為偶數都可以由奇奇或奇偶或偶偶得到,所以必勝;當牛牛執行最後一次的時候,這時的牌只有是奇奇或奇偶才能贏。且牛牛為了勝利要努力消除偶數、得到奇數,每輪最多只能消除乙個偶數(奇偶),而牛妹則是要努力得到偶數、消除奇數,每輪最多能消除兩個奇數(奇奇),一消一漲,偶數的個數不會增加。所以當有兩個偶數以上時,牛妹必勝,牛牛必輸。

#include

using

namespace std;

int a[

1000010];

intmain()

if(n ==1)

else

if(n %2)

printf

("niumei\n");

else

}

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

三場牛客下來覺得自己越來越不在狀態,思路不清晰,一下手就是bug,每調完一題刷下榜都被甩開十里地,罰時慘不忍睹 傳送門 簽到 include using namespace std typedef long long ll const ll inf 0x3f3f3f3f const ll mod 1...

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

題目描述 請你構造乙個非空的括號字串,包含正好 k 個不同合法括號對。所謂括號字串,是指由 和 這兩種字元構成的字串。要求構造的字串長度不超過100000。輸入描述 乙個整數 k。乙個整數 kk。0 k 1e9 輸出描述 乙個僅包含左右括號字串,其中有 kk 個合法的括號對。如果有多種構造方法,輸出...

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

思路 k1排k2前面滿足 k1.a k2.ax k2.b k1.b k1.ax k1.b k2.b k2.ak1.b k2.b k1.a k2.a k1.b include define ull unsigned long long define ll long long const int inf...