2017多校第4場 懶人跑步(spfa 思維題)

2022-07-22 12:27:14 字數 1519 閱讀 4170

題目描述

在zju,每個學生都被要求課外跑步,並且需要跑夠一定的距離 k

'>k 

,否則體育課會掛科。

zju有4個打卡點,分別標記為 p1,

p2,p

3,p4

'>p1,p2,p3,p4

。每次你到達乙個打卡點,你只需要刷一下卡,系統會自動計算這個打卡點和上乙個打卡點的距離,並將它計入你的已跑距離。

系統把這4個打卡點看成乙個環。 p

1'>p1

與 p2

'>p2

相鄰、 p

2'>p2

與 p3

'>p3

相鄰、 p

3'>p3

與 p4

'>p4

相鄰、 p

4'>p4

與 p1

'>p1

相鄰。當你到達打卡點 p

i'>pi

時,你只能跑到與該打卡點相鄰的打卡點打卡。

打卡點 p

2'>p2

是離宿舍最近的乙個打卡點。cjb總是從 p

2'>p2

出發,並回到 p

2'>p2

。因為cjb很圓,所以他希望他跑的距離不少於 k

'>k

,但又要盡量小。

p

2'>題解p2

'>取 d=min(dis1-2,dis2-3),那麼對於每種方案,均可以通過往返跑 d 這條邊使得距離增加 2dp2

'>令 w=2d,dp[i][j] 表示從起點出發到達 i ,距離模 w 為 j 時的最短路,這個由 spfa 可求得,時間複雜度為 o(w logw)p2

'>最後,我們由 dp[p2][j] 即可求出最優路線(具體見圖)p2

'>

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int t,w,d[4],inque[4][60001

];ll k,dp[

4][60001

];struct que;

queue

q;int

main());

inque[

1][0]=1

;

while(!q.empty()));

inque[nxt][(m+d[p])%w]=1

; }

}if(dp[p][m]+d[pre]w]));

inque[pre][(m+d[pre])%w]=1

; }}}

while(dp[1][k%w]>k)k++;

printf(

"%lld\n

",k);

}return0;

}

多校第4場1012

理解題意以後會發現時比較簡單的線段樹,理解題意以後首先應該想到乙個貪心,就是再尋找最終答案的第i個數時,餓哦們要盡量使這個數盡可能大。那麼我們找 1,pos i 1 這個區間中已經組隊的位置的最大值,記為l,然後找 l 1pos i 1 之間未被找過的最大的數。這裡組隊的意思是可以詳見程式,並不是被...

多校第4場1012

理解題意以後會發現時比較簡單的線段樹,理解題意以後首先應該想到乙個貪心,就是再尋找最終答案的第i個數時,餓哦們要盡量使這個數盡可能大。那麼我們找 1,pos i 1 這個區間中已經組隊的位置的最大值,記為l,然後找 l 1pos i 1 之間未被找過的最大的數。這裡組隊的意思是可以詳見程式,並不是被...

多校第9場

這道題挺水,只是要耐心的打表,我一開始只打了一半就不想做了,也是因為我的方法太麻煩了,把x,y座標分開存,處理的資料量差不多增加了一倍。這題有一點注意 題目中並沒有限制字串的長度,所以char陣列盡量開大些。下面是賽後ac的 include include include include inclu...