自出題,寫題解《招募士兵》

2022-07-24 10:24:11 字數 2468 閱讀 2575

招募士兵

(conscription.pas/c/cpp)

【問題描述】

小w擁有乙個國家,現在他希望建立一支軍隊來保護他的國家。他選中了n個女孩和m個男孩希望招募他們成為他的士兵。在沒有任何先決條件的情況下,他招募乙個士兵需要花費10000rmb。現在小w可以利用這些人之間的關係來減少他的花費。如果女孩x和男孩y存在有乙個關係值d(兩人之間可能有多個關係值),而且她們之中有乙個人被招募了。那麼小w可以在招募另乙個人的時候減少d的花費(實際10000-d的費用)。

現在給你這些男孩女孩之間的關係,希望你告訴小w告訴他招募所有人的最少花費。

注意:招募某乙個人時,只能利用乙個關係。

【輸入】

輸入檔案conscription.in中檔案第一行包含三個整數n,m,r。表示n個女孩,m個男孩與r條關係。

接下來r行,每行包含三個整數xi,yi和di,表示女孩xi和男孩yi有di的關係。

【輸出】

conscription.out中只有一行乙個數,為最小費用。

【輸出樣例】

5 5 8

4 3 6831

1 3 4583

0 0 6592

0 1 3063

3 3 4975

1 3 2049

4 2 2104

2 2 781

【輸出樣例】

71071

【資料說明】

100%的資料:1<=n, m <=100000,0 <=r <=200,000,0 < di < 10000

本題烤驢到乙個並查集的問題,然後,我們把他可以減少的價錢排個序,再乙個乙個地去並起來,如果他們的father一樣,就不可以並起來,這樣子就能解決問題。

type

new=record

x:longint;

y:longint;

r:longint;

bz:boolean;

end;

var i,j,k,l,n,m,r,v,x,y:longint;

ans:int64;

f:array[0..200000] of longint;

a:array[1..200000] of

new;

bz:boolean;

procedure

qs(l,r:longint);

var i,j,m:longint;

t:new;

begin

i:=l;

j:=r;

m:=a[(l+r) div

2].r;

repeat

while a[i].r>m do inc(i);

while a[j].rdo dec(j);

if i<=j then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;

until i>j;

if lthen qs(l,j);

if ithen qs(i,r);

end;

function

zs(t:longint):longint;

var i,j,k,l:longint;

begin

l:=t;

while f[t]<>t do

begin

t:=f[t];

end;

while f[l]<>t do

begin

j:=f[l];

f[l]:=t;

l:=j;

end;

zs:=t;

end;

begin

readln(n,m,r);

for i:=1

to r do

begin

readln(a[i].x,a[i].y,a[i].r);

a[i].y:=a[i].y+n;

end;

for i:=1

to n+m do f[i]:=i;

qs(1,r);

ans:=0;

v:=0;

for i:=1

to r do

begin

if zs(a[i].x)<>zs(a[i].y) then

begin

x:=zs(a[i].x);

y:=zs(a[i].y);

f[x]:=y;

a[i].bz:=true;

ans:=ans+(10000-a[i].r);

inc(v);

end;

end;

writeln(ans+(n+m-v)*10000);

end.

出題 題解4

由於3比較水略過 這個你只要對所有vi 按p取模,然後排個序,再列舉每個點,按照p vi在陣列上二分即可。有個坑就是二分到的可能是自己,造資料的時候特意卡了一下,不跳的就只有40分。這個你只要考慮每條邊在答案裡的貢獻即可,列舉 v 子樹to 裡黑點的個數 w 然後這條邊的貢獻就是 k w w va ...

學長出題 比賽題解 17 10 18

這次比賽由 falldream學長出題,歡迎去他的blog學習!t1 切課本 題意 小 z 厭惡數學,他決定將數學課本切成一塊一塊的。他的課本是乙個 n m 的矩形,小 z 決定切 k 刀,每刀他可以橫著切或者豎著切,但是切成的矩形的長和寬都必須是整數。當然,小 z 不會做出兩次相同的操作。例如 n...

20200509 自招題目

對集合 及其每乙個非空子集,定義乙個唯一確定的 交替和 如下 按照遞減的次序重新排列該子集,然後交替地減或加後繼的數所得的結果,例如,集合 的 交替和 是 9 6 4 2 1 6 的 交替和 是 6 5 1 的 交替和 是 2 那麼,對於 n 7 求所有子集的 交替和 的總和.g 7 2 times...