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

2022-05-06 21:15:10 字數 4155 閱讀 3392

菊苣的題解

#includeusing namespace std;

int main()}}

在乙個班級裡有n個同學

每個人在考試後會得到乙個a,b,c,d,e的等級和乙個分數,學校要求得到等級a的人不超過k個。

已知第i個同學在得到五個等級時預期的分數分別為ai,bi,ci,di,ei

請問在最理想的情況且不違反上述條件的情況下,他們的預期分數最大值和最小值之差最小為多少。

優先佇列,貪心模擬,先全是e,然後取最小的值,變成d,然後乙個個模擬,直到k==0或者全部變成a,過程中必定有最小之差

#include#define endl '\n'

#define ios ios::sync_with_stdio(false),cin.tie(0)

#define mem(a,b) memset(a,b,sizeof a)

#define pii pair#define ll long long

#define mod 1000000007

const double pi = acos(-1);

using namespace std;

const int n = 1e5+10;

const int modd=1e9;

struct node

friend bool operator

};int a[n][5];

int main()

node t(i,4,a[i][4]);

ma=max(a[i][4],ma);

q.push(t);

}int res=modd;

while(1)

cout在乙個二維平面上有n(小於等於10)個敵人,第i個敵人可以描述為乙個以(xi,yi)(abs(xi or yi)<=7)為圓心,ri(ri<=7)為半徑的圓。

你每次可以對乙個半徑為r(r<=7)的圓範圍內進行攻擊(圓心自選,但圓心的橫縱座標必須為整數),對於與你攻擊範圍有交點的敵人都會被消滅。

你總共可以發動k次攻擊,問最多能消滅多少敵人。

範圍都很小,可以直接暴力來,我用了狀壓dp來寫,奈何語文理解不夠,以為圈內的不算敵人數,wa了6發……然後問隊友哪錯了,默默地來一句,呼啦圈攻擊是吧

#include#define endl '\n'

#define ios ios::sync_with_stdio(false),cin.tie(0)

#define mem(a,b) memset(a,b,sizeof a)

#define pii pair#define ll long long

#define mod 1000000007

const double pi = acos(-1);

using namespace std;

const int n = 1e6+10;

const int modd=1e9;

int x[15],y[15],r[15];

int dp[3000][3];

int n,k,r;

int mp[900];

int pan(int xx,int yy,int x2,int y2,int r2)

else if(dp[i][k-1])}}

}int mx=1;

for(int i=0;i<=(1<>=1;

}mx=max(mx,ge);}}

printf("%d\n",mx);

return 0;}/*

2 2 1

0 0 1

0 0 1

*/

讀題不仔細

在賣禮物的超市中有n個櫃子,每個櫃子裡都擺放了乙個禮物,每個禮物有自己的乙個編號,第i個櫃子裡的禮物編號為ai。

茶山牛想給牛牛和牛妹買相同編號的禮物,但禮物有可能在某個時刻被其他人買走,而且櫃子數量太多,因此茶山牛在某個時刻只想知道某乙個櫃子區間是否能買到兩件相同編號的禮物。

具體來說,有q次操作,格式如下:

1 x,第x個櫃子裡的禮物被買走,保證此時這個櫃子裡的禮物還在。

2 l r,茶山牛詢問第l到第r個櫃子未被買走的禮物中是否有兩個禮物編號相同。

題解菊苣的思路,然後我理解完寫了一邊orz

記錄每乙個數字後面第乙個等於它的數字的位置,查詢區間l和r的最小值是否小於r,如果小於等於r則有相同數

因為有操作1,刪除某個值,所以需要用鍊錶維護,這個數字前面第乙個等於它的數字位置和後面第乙個等於它的數字的位置。

#include#define endl '\n'

#define ios ios::sync_with_stdio(false),cin.tie(0)

#define mem(a,b) memset(a,b,sizeof a)

#define pii pair#define ll long long

#define mod 1000000007

const double pi = acos(-1);

using namespace std;

const int n = 5e5+10;

const int modd=1e9;

int tree[n<<2],a[n],pos[n],qian[n];

int n,q;

void pushup(int rt)

void build(int l,int r,int rt)

int mid=(r+l)>>1;

build(l,mid,rt<<1);

build(mid+1,r,rt<<1|1);

pushup(rt);

}void update(int l,int r,int rt,int x,int zhi)

int querry(int l,int r,int rt,int l,int r)

int main()

else

}for(int i=1;i<=n;i++)

build(1,n,1);

for(int i=0;i>c;

if(c==1)

else else

}reverse(s, s + len);

for (int i = 0; s[i] != '#'; i++) else }}

printf("%d\n", ans);

return 0;}/*

4abc#a

abf#a

#a#a

0*/

在乙個幼兒園裡面有\mathit nn個小朋友,分別編號1,2,...,n。在這些小朋友中有一些小朋友互為朋友關係,總共有m對朋友。

作為幼兒園老師,你想買一些糖果分給小朋友,你知道第i個小朋友想要至少a[i]個糖果,否則他就會不開心。

同時,如果乙個小朋友得到的糖果數小於他某個朋友得到的糖果數,他也會不開心。

請問你最少買多少糖果才能保證每個小朋友都不會不開心呢?

一看就是並查集找個數,然後找集團最大值,比賽中的提示誤人,幸好直接忽略了,因為好像標記標反了wa了一發

#include#define endl '\n'

#define ios ios::sync_with_stdio(false),cin.tie(0)

#define mem(a,b) memset(a,b,sizeof a)

#define pii pair#define ll long long

#define mod 1000000007

const double pi = acos(-1);

using namespace std;

const int n = 1e6+10;

const int modd=1e9;

int f[n],a[n],ge[n];

int f(int x)

void init()

else if(s[i-1]>'t')

else

}if(flag)

else}}

if(!flag && ou==0)

else

return 0;

}

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