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

2022-06-14 18:42:07 字數 3423 閱讀 4926

目錄看資料範圍暴力

(i)直接暴力列舉敵人位置(15*15),根據k次攻擊進行k+1重迴圈

k再大一點,這種方法就不適用了,可以用dfs狀壓代替(見法二)

#include using namespace std;

typedef long long ll;

const int maxn = 1e6 + 3;

const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

const double pi = acos(-1.0);

struct node

pro[12];

struct node2

pro2[230];

bool jud(int x, int y, int r, int x1, int y1, int r1)

int main()

ans = max(ans, cnt);}}

else if(m ==2)

if(pro[k].f) continue;

if(jud(pro2[j].x, pro2[j].y, r, pro[k].x, pro[k].y, pro[k].r) && !pro[k].f)

}ans = max(ans, cnt);

for(int k = 1; k <= n; ++k) pro[k].f = 0;}}

}else if(m == 3)

if(pro[t].f) continue;

if(jud(pro2[j].x, pro2[j].y, r, pro[t].x, pro[t].y, pro[t].r) && !pro[t].f)

if(pro[t].f) continue;

if(jud(pro2[k].x, pro2[k].y, r, pro[t].x, pro[t].y, pro[t].r) && !pro[t].f)

}ans = max(ans, cnt);

for(int k = 1; k <= n; ++k) pro[k].f = 0;}}

}}

cout << ans << endl;

}

(ii)dfs狀壓

由於每個模式串至少有乙個『#』,所以只需要保證所有模式串字首(第乙個『#』前)和字尾(最後乙個『#』後)不互相矛盾即可

注意:並不是要求所有字首都一樣,字尾都一樣,而是保證不矛盾就可以,比如a#和ab#可以共存

wa點:反向看字尾時b陣列要正著存!!因為模式串長度不一定相同,倒著存可能導致b的下標不同

#include using namespace std;

typedef long long ll;

const int maxn = 1e6 + 3;

const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

const double pi = acos(-1.0);

char a[maxn], b[maxn];

int main()

for(int j = s.size() - 1; ; --j)

}cout << ans << endl;

}

每乙個朋友圈的每個小朋友都要給所在朋友圈中糖果數的最大值,並查集維護朋友圈

如何處理找到最大值:首先建圈時先不處理,建好圈後,遍歷n個小朋友,對每個小朋友都find其父親,並將父親的糖果數置為他與他父親糖果數的最大值,這樣遍歷一次後的效果是,每個小朋友都直接連著父親(由於路徑壓縮),而且每個父親的糖果數都是所在朋友圈的最大值。然後再遍歷n個小朋友,每個小朋友得到的糖果數就等於其父親的,累加即可

注意:字母串不僅可以變長,還可以變短!比如,aaa可以變成ka

滿足這種情況的只能接到a或b之後,然後在符合條件的情況下,將a或b與後乙個字母的第一位組合成新的,後乙個字母的第二位(如果有的話)單獨成為乙個即可(10,20不行,由於0沒有字母匹配)

#include using namespace std;

typedef long long ll;

const int maxn = 1e6 + 3;

const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

const double pi = acos(-1.0);

vectorv;

int main()

tmp2 = s[i+1] - 'a' + 1;

if(tmp2 > 10 && tmp2 % 10 != 0)

else if(tmp2 < 10)

}else

}if(!flag) cout << -1 << endl;

else

else

s.insert(a[i]);}}

cout << ans << endl;

}

(ii)dp

n張牌,最後剩一張,則經過n-1輪。若n為奇數,則最後一輪是牛妹,因為無論何種情況的兩張牌(奇奇、偶偶、奇偶),都可以變為偶數,所以牛妹一定贏。若n為偶數,則最後一輪是牛牛,此時如果至少有乙個奇數,牛牛就能贏;若兩張全為偶,牛牛就輸。所以整個過程中,牛牛試圖保留奇數,消滅偶數。而奇+偶=奇,奇*奇=奇只有這兩種生成奇數的方式,牛牛一定選第一種,因為第一種不消耗奇數,還能消耗乙個偶數。所以牛牛每次操作都是消耗乙個偶數,奇數個數不變。牛妹試圖消滅奇數,奇+奇=偶,所以牛妹每次操作都是消耗兩個奇數,增加乙個偶數。牛牛共有(n-1-1)/2+1=n/2次操作,牛妹共有n/2-1次操作,若牌數夠,牛妹可以消耗n-2張奇數,而牛牛不產生奇數,所以若原有n-1張或n張奇數,牛妹消耗不掉,那麼牛牛就贏。

注意:!!開始將n分奇偶前,要特判只有一張牌的情況。因為只有一張牌時,若為奇數,雖然此時牌數為奇數,但是牛牛贏

#include using namespace std;

typedef long long ll;

const int maxn = 1e6 + 3;

const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

const double pi = acos(-1.0);

vectorv;

int a[maxn];

int main()

if(n == 1)

if(n % 2 == 1)

if(cnt <= 1) cout << "niuniu" << endl;

else cout << "niumei" << endl;

}

官方題解

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...