2017 8 6普及模擬 最大(max)

2021-08-05 19:03:37 字數 2711 閱讀 4737

題目大意:

bt一天晚上發現

叢林的每棵樹上都有些漿果,bt想把這些果子都拿回去做研究,然而bt認為一次拿太多會很不爽,所以他想知道,他從營地到準備考察的地方,一每棵樹上的漿果最大值的最小值。當然,bt的早餐能量有限,而從一棵樹到另一棵樹所需能量是已知的,bt要保證來回所需能量小於等於早餐所提供的能量。

輸入:第一行5個正整數,n(1<=n<=10000),m(1<=m<=25000),s,t,st。分別表示有n棵樹,m條路徑,從營地s到考察處t,早餐的能量為st。

接下來有n行,每行1個正整數,fi。表示第i棵樹上的漿果重量。 再接下來有m行,每行3個正整數,x,y,d (1<=x,y<=n)。表示第x棵樹和第y棵樹之間可通行,且所需能量為d。

輸出:一行,路徑上漿果重量最大值的最小值。若bt無法從營地和考察地間走乙個來回,則輸出-1.

樣例輸入

4 4 2 3 885

6102 1 2

2 4 1

1 3 4

3 4 3

樣例輸出

10

所有數<

2^63

淼淼淼淼!

一道赤裸裸的二分外加最短路!

二分列舉答案,刪掉大於答案 的點即可。

再spfa,合法r左移,不合法l右移。

於是.....

184826

2167

2017王譽達

評測通過

10065 ms

7.98 mb

pascal

2945 bytes

2017-08-06 16:02:41

注意細節!細節!細節!謹慎處理!

標程(請勿抄襲):

vari:longint;

j,k,m,n,o,p,l,s,t,r,mid,x,y,c,head,tail,q1:int64;

b,f:array[1..100000,1..3] of int64;

q,a,h,long:array[1..100000] of int64;

bz,spfa:array[1..100001] of boolean;

procedure insert(x,y,z:longint);

begin

inc(t);

f[t,1]:=y;

f[t,2]:=q[x];

f[t,3]:=z;

q[x]:=t;

end;

function pd(a:longint):longint;

begin

if  a=0 then exit(maxlongint) else exit(a);

end;

begin

assign(input,'max.in');reset(input);

assign(output,'max.out');rewrite(output);

readln(n,m,x,y,c);

c:=c div 2;

for i:=1 to n do readln(a[i]);

for i:=1 to m do begin

readln(o,p,q1);

insert(o,p,q1);

insert(p,o,q1);

end;

l:=0;r:=9223372036854775806;  mid:=(l+r) div 2;

while l<=r do begin

fillchar(bz,sizeof(bz),true);

for i:=1 to n do begin

if a[i]>mid then bz[i]:=false;

long[i]:=0;

end;

if (bz[x]=false) or (bz[y]=false) then begin

l:=mid+1;

mid:=(l+r) div 2;

//if mid*2<>l+r then mid:=mid+1;

continue;

end;

fillchar(spfa,sizeof(spfa),true);

head:=0;tail:=1;h[1]:=x;spfa[x]:=false;

while head0 do begin

if bz[f[k,1]]=false then begin

k:=f[k,2];

continue;

end;

if long[h[head]]+f[k,3]0) and (long[y]<=c) then begin

r:=mid-1;

mid:=(l+r) div 2;

//if mid*2<>l+r then mid:=mid+1;

end else begin

l:=mid+1;

mid:=(l+r) div 2;

//if mid*2<>l+r then mid:=mid+1;

end;

end;

///writeln(long[y]);

// if (long[y]=0) or (long[y]>c) then inc(mid);

if mid*2<>l+r then inc(mid);

writeln(mid);

close(input);close(output);

end.

小結 普及模擬3 26

普及模擬 石子遊戲 普及模擬 公共子串 普及模擬 射擊 普及模擬 過河 60 100 0 50 210 還可以,就是第一題有點可惜,沒有想到那個詭異的優化.t1 簡單地說就是它說什麼,你打什麼.打錯了怪我嗦 開乙個棧,把顏色相同的壓在一起 這樣就可更加快速的進行 各種神奇的操作 t2 裸題裸得也太嚴...

17 05 14 普及模擬 題解

第一題 無限劍製 很簡單的模擬題,求出這個西格瑪就好,資料規模也不大 第二題 魔法陣 也很簡單,只是這題目給參加過2016noip的我著實嚇了一跳。汗 簡單說,也是模擬 兩個陣列,兩個迴圈,改變方陣中的元素位置 第三題 倒水 題目挺長的,唬人 然而仔細閱讀整個題目就知道,其實是個模擬 資料規模不大,...

普及模擬 好數

對於乙個正整數x,如果把x化成二進位制數後,如果x的二進位制數至少有三個連續的1或者至少有3個連續的0 不能有前導0 那麼x就是 好數 例如8就是 好數 因為8對應的二進位制數是1000,有三個連續的0。整數15也是 好數 因為15對應的二進位制數是1111,也有三個連續的1。整數27就不是 好數 ...