牛客演算法周周練13

2022-09-09 00:33:22 字數 3602 閱讀 4342

a、最小生成樹

小 a 有一張 n 個點的帶權無向圖,這張無向圖非常特別,首先第 i 個點有乙個點權 ai,之後這張無向圖是一張完全圖,且邊 (u,v) 的權值為 au+**

現在小 a 想找乙個這張圖的邊權之和最小的生成樹,需要你來幫幫他

題解:

每個點都和最小那個點連線形成的樹即最小生成樹

注意:使用長整形

ac**:

#include#includeusing namespace std;

#define ll long long

const int maxn = 1e5 + 15;

ll a[maxn];

int main()

b、病毒感染

有一天clccle和rqy走在某個國家的街頭上,機智的rqy卻發現周圍的行人不太對勁,他們嘴裡念念有詞,說著"sqn tql!",一邊漫無目的的行走,clccle也發現了這一點,卻驚訝的發覺這種奇怪的病毒會向周圍的城市,最終會感染整個國家,因為網路已經崩潰,所以她們忘記了自己所在的城市,她們唯一知道的是這種病毒是從當前她們所在的城市開始傳播的,並且這個國家的所有城市到這個城市的距離和最小(所有道路的距離都為1),現在給定聰明的你一張整個國家的地圖,請你幫rqy和clccle找到她們現在可能在這個國家的哪乙個城市.

題解:

樹的重心板子題

ac**:

#include#include#include#includeusing namespace std;

#define ll long long

#define inf 0x3f3f3f3f

const int maxn = 1e5 + 15;

vectorg[maxn];

vectorans[maxn];

int minn;

int d[maxn];

int n, m;

/*樹的重心求法:遍歷所有點的子樹的大小,然後重心存在的那個點就是最大子樹最小的那個點

*/void dfs(int u, int fa)

} maxx = max(maxx, n - d[u]);

if (maxx <= minn)

}int main()

minn = inf;

dfs(1, 0);

sort(ans[minn].begin(), ans[minn].end());

for (int i = 0; i < ans[minn].size(); i++)

cout << ans[minn][i] << " ";

return 0;

}

c、shooping

你要買n件物品,其中有一些是凳子。

商場正在舉行**活動,如果購物車中有至少乙個凳子,那麼你可以半價購買這個購物車中最貴的乙個物品。

你有m輛購物車,請最小化你的花費。

題解:

找出min(m,凳子數量),然後對前k大的物品進行打折就好

ac**:

#include#include#includeusing namespace std;

#define ll long long

const int maxn = 1e3 + 15;

bool cmp(double a, double b)

int main()

sort(a, a + n, cmp);

for (int i = 0; i < min(num, m); i++)

ans -= a[i] / 2;

printf("%.1lf\n", ans);

} return 0;

}

d、鋪地毯

為了準備乙個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角座標系的第一象限)鋪上一些矩形地毯。一共有n張地毯,編號從1到n。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。

題解:

將所有地毯按順序依次鋪上,然後倒序查詢最上面的即可

ac**:

#include#includeusing namespace std;

#define ll long long

const int maxn = 1e6 + 15;

struct node a[maxn];

int main()

} if (is_ok == 0)

cout << -1 << endl;

return 0;

}

e、金幣陷阱

最近,奶牛們熱衷於把金幣包在麵粉裡,然後把它們烤成餡餅。第i塊餡餅中含有ni(1<=ni<=25)塊金幣,並且,這個數字被醒目地標記在餡餅表面。

奶牛們把所有烤好的餡餅在草地上排成了乙個r行(1<=r<=100)c列(1<=c<=100)的矩陣。你現在站在座標為(1,1)的餡餅邊上,當然,你可以拿到那塊餡餅裡的所有金幣。你必須從現在的位置,走到草地的另一邊,在座標為(r,c)的餡餅旁邊停止走動。每做一次移動,你必須走到下一列的某塊餡餅旁邊,並且,行數的變動不能超過1(也就是說,如果現在你站在座標為(r,c)的餡餅邊上,下一步你可以走到座標為(r-1,c+1),(r,c+1),或者(r+1,c+1)的餡餅旁邊)。當你從一塊餡餅邊經過,你就可以拿走餡餅裡所有的金幣。當然啦,你一定不會願意因半路離開草地而失去唾手可得的金幣,但,最終你一定得停在座標為(r,c)的餡餅旁邊。

現在,你拿到了一張標記著餡餅矩陣中,每一塊餡餅含金幣數量的**。那麼,按照規則,你最多可以拿到多少金幣呢?

題解:

大佬們拿dp寫的,卑微的我看不懂,只好裸dfs了

搜尋**:

#include#includeusing namespace std;

#define ll long long

const int n = 1e2 + 5;

#define inf 0x3f3f3f3f

int a[n][n];

int vis[n][n];

int r, c;

int dir[3][2] = , , };

int dfs(int x, int y)

return vis[x][y];

}int main()

dp**:

#include#include#includeusing namespace std;

#define ll long long

const int n = 1e2 + 5;

#define inf 0x3f3f3f3f

int a[n][n], dp[n][n];

int r, c;

int main()

} }cout << dp[r][c] << endl;

return 0;

}

牛客演算法周周練13水題

powered by ab in 局外人 貪心演算法,最小的數當父節點,其他數均為子節點。n int input a list map int input split a.sort print sum a a 0 n 2 依然是貪心,把獲得半價的權力給 高的即可。include pragma gcc...

牛客演算法周周練2

a 題意 求乙個數的順序和逆序之和。題解 其實就是個閹割版的高精度加法嘛。其實逆序數忽略前導零這個條件是沒有用的,因為順序數不可能有前導零,自然結果也不會有,然後注意下首位進製不取餘。include using namespace std int a 10 b 10 intmain for k j ...

牛客演算法周周練2

題目鏈結 include define sc x scanf lld x define pf printf define rep i,s,e for int i s i e i define dep i,e,s for int i e i s i using namespace std typede...