(↓解説というより自分用メモ書き)
動的計画法みたいな感じでできる?
とりあえず配列で表してみる
P[A,G]=AにGが祈れる人数
R[A,G]=↑の残り魔力
P2[A,S,E]=AにS〜Eが祈れる人数
R2[A,S,E]=↑の残り魔力
配列は1次元までにしないとメモリが足りなくなる
PとRは配列を使わなくても関数でできる
(↑DEF P(A,G), DEF R(A,G) よりも DEF PR A,G OUT P,R の方が効率よさそう)
P2,R2はうまく前の値を使って求められないか?
Eを増やしていく方向だと
P2[A,S,E]=P2[A,S,E-1]+P[R2[A,S,E-1],E]
R2[A,S,E]=R[R2[A,S,E-1],E]
Sを減らしていく方向だと
P2[A,S,E]=P[A,S]+P2[R[A,S],S+1,E] ←AとSの部分が変わるので2次元必要
AとE固定してP2[S]を配列で定義すると、
E=2→Aと増やしていけば前のP2,R2を使って次のP2,R2を計算できそう
DIM O[M+1]
DIM P2[MAX(A)+1] ' ,P2C[MAX(A)+1]
DIM R2[MAX(A)+1] ' ,R2C[MAX(A)+1]
DIM Y[M+1] 'SORTするので何年目か記憶しておく
FOR I=1 TO M: Y[I]=I: NEXT
SORT E,K,S,Y
FOR J=1 TO N
Y_ID=1 'E[0]=0なので1から
A1=A[J] '木Jの最大魔力
FILL P2,0
FILL R2,A1
'初期値E1=1
'P2,R2に特別な初期化不要
FOR E1=2 TO A1
' COPY P2C,P2 コピーする必要なかった
' COPY R2C,R2
FOR S1=2 TO E1
PR R2[S1],E1 OUT P,R
P2[S1]=P2[S1]+P '← P(R2[S1],E1)
R2[S1]=R '← R(R2[S1],E1)
NEXT
WHILE E[Y_ID]==E1
IF J<=K[Y_ID] THEN 'Yの年に木の魔力が最大になってれば
INC O[Y[Y_ID]],P2[S[Y_ID]]
ENDIF
INC Y_ID
WEND
NEXT
NEXT
DEF PR A,G OUT P,R
P=0:R=A
WHILE R MOD G==0
P=P+1
R=R/G
WEND
END
FOR I=1 TO M
?O[I]
NEXT
(さらっとできたように書いてるがここに至るのに1時間以上かかってる)
結局3重ループしてるけど速くなってるのかなこれ?