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