牛客網 關押囚犯

2021-09-09 08:57:13 字數 1139 閱讀 5899

中文題目 直接貼上了

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1~n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c 的衝突事件。

每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。

在詳細考察了 n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那麼,應如何分配罪犯,才能使 z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?

很明顯,直接並查集維護,我們仔細觀察會發現這個類似二分圖,當然不是二分圖,我們用貪心的思路去看,肯定是先解決掉較大的矛盾,較大矛盾的雙方肯定分配到兩個不同監獄了,那麼我們完全可以維護乙個敵人並查集 陣列開到 2n 然後n+1到2n 是敵人部分,這樣的話 我們把矛盾較大的雙方先分開,之後如果發現還有和這個人有矛盾的,根據敵人的敵人是朋友的思路,也就只能分到乙個監獄了,那麼既然我們是從大到小處理,直接輸出就是最大矛盾了。

以下是 ac **

#include using namespace std;

const int maxn = 1e5+5;

int pre[maxn];

void init(int n)

struct node

ed[maxn];

bool cmp(node a,node b)

int findd(int x)

int main()

sort(ed+1,ed+1+m,cmp);

for(int i=1;i<=m;i++)

pre[fx] = findd(ed[i].y+n);

pre[fy] = findd(ed[i].x+n);

} printf("0\n");

return 0;

}

牛客網關於陣列的練習題記錄

1.對矩陣壓縮儲存是為了 a,方便運算 b,方便儲存 c,提高運算速度 d,減少儲存空間 答案 d 解析 不管是鄰接矩陣還是鄰接表,都節省了儲存空間 2.單選題 有兩個n n的矩陣a和b,想要在pc上按矩陣乘法基本演算法程式設計實現計算a b。假設n較大,本機記憶體也很大,可以存下a b和結果矩陣。...

牛客網 關於連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...

牛客網 關於對稱的二叉樹

請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。public class treenode public class solution return comparenode proot.left,proot.right boolean c...