1. 程式人生 > >JZOJ_4722. 跳樓機 (Standard IO)

JZOJ_4722. 跳樓機 (Standard IO)

ext clas size fields and adl inpu 模型 學習

Description


DJL為了避免成為一只鹹魚,來找srwudi學習壓代碼的技巧。
Srwudi的家是一幢h層的摩天大樓。由於前來學習的蒟蒻越來越多,srwudi改造了一個跳樓機,使得訪客可以更方便的上樓。
經過改造,srwudi的跳樓機可以采用以下四種方式移動:
1、向上移動x層;
2、向上移動y層;
3、向上移動z層;
4、回到第一層。
一個月黑風高的大中午,DJL來到了srwudi的家,現在他在srwudi家的第一層,碰巧跳樓機也在第一層。DJL想知道,他可以乘坐跳樓機前往的樓層數。

Input

第一行一個整數h,表示摩天大樓的層數。
第二行三個正整數,分別表示題目中的x, y, z。

Output

一行一個整數,表示DJL可以到達的樓層數。

Solution

直接BFS,狀態太多,我們考慮減少狀態。
記di=c,表示在滿足c mod x=i的前提下,僅通過第二和第三個操作可以到達的最小樓層c。
如果我們得到di,那麽最後的答案就是技術分享圖片
對於di的計算,我們有如下兩種形式的轉移
d(i+y) mod x=di+y
d(i+z) mod x=di+z
不難發現,這就是一個最短路模型,直接上SPFA。

代碼

 1 type
 2   arr=record
 3     y,next,w:longint;
4 end; 5 var 6 n,ans:int64; 7 nm,xx,yy,zz:longint; 8 a:array [0..200001] of arr; 9 ls,list,v:array [0..100001] of longint; 10 d:array [0..100001] of int64; 11 procedure add(x,y,z:longint); 12 begin 13 inc(nm); 14 a[nm].y:=y; a[nm].w:=z; 15 a[nm].next:=ls[x]; ls[x]:=nm; 16 end; 17
18 procedure init; 19 var 20 i,t:longint; 21 begin 22 fillchar(ls,sizeof(ls),255); 23 readln(n); 24 readln(xx,yy,zz); 25 if xx<yy then 26 begin 27 t:=xx; xx:=yy; yy:=t; 28 end; 29 if xx<zz then 30 begin 31 t:=xx; xx:=zz; zz:=t; 32 end; 33 nm:=0; 34 for i:=0 to xx-1 do 35 begin 36 add(i,(i+yy) mod xx,yy); 37 add(i,(i+zz) mod xx,zz); 38 end; 39 end; 40 41 procedure spfa; 42 var 43 i,tail,head,x:longint; 44 begin 45 for i:=0 to 100001 do 46 d[i]:=9223372036854675807; 47 fillchar(v,sizeof(v),0); 48 head:=0; tail:=1; 49 list[1]:=1; d[1]:=1; v[1]:=1; 50 repeat 51 inc(head); x:=list[head]; 52 i:=ls[x]; 53 while i<>-1 do 54 with a[i] do 55 begin 56 if d[x]+w<d[y] then 57 begin 58 d[y]:=d[x]+w; 59 if v[y]=0 then 60 begin 61 inc(tail); 62 list[tail]:=y; 63 v[y]:=1; 64 end; 65 end; 66 i:=next; 67 end; 68 v[list[head]]:=0; 69 until head>tail; 70 end; 71 72 procedure print; 73 var 74 i:longint; 75 begin 76 ans:=0; 77 for i:=0 to xx-1 do 78 if n-d[i]>=0 then 79 ans:=ans+(n-d[i]) div xx+1; 80 writeln(ans); 81 end; 82 83 begin 84 init; 85 spfa; 86 print; 87 end.

JZOJ_4722. 跳樓機 (Standard IO)