題目描述
小希現在要從寢室趕到機房,路途可以按距離分為n段,第i個和i+1個是直接相連的,只需要一秒鐘就可以相互到達。
炫酷的是,從第i個到第i+2^pi+2
p個也是直接相連的(其中p為任意非負整數),只需要一秒鐘就可以相互到達。
更炫酷的是,有k個傳送法陣使得某些u,v之間也是直接相連的,只需要一秒鐘就可以相互到達,當然,由於裝置故障,可能會有一些u=v的情況發生。
現在小希為了趕路,她需要在最短的時間裡從寢室(編號為1)到達機房(編號為n),她不希望到達這n個部分以外的地方(不能到達位置n+1),也不能走到比自己當前位置編號小的地方(比如從5走到3是非法的)。
她想知道最短的時間是多少。
輸入描述:
第一行輸入兩個整數n,k,表示路途的段數和傳送法陣的數量。
從第二行開始k行,每行兩個整數ai,bi表示兩個位置之間相連。
輸出描述:
輸出乙個整數,表示從寢室到機房最短的時間是多少秒。
示例1輸入
複製12 2
1 56 6
輸出複製
3示例2
輸入複製
17 2
2 58 9
輸出複製
1思路:題目告訴你了出來從i走到i+1以外還有兩種方式,一種是k個傳送門,另外是二進位制,根據貪心思想,我們是不是盡可能的能走傳送門就走傳送門,能走二進位制就走二進位制,所以這樣的話走的點就不會很多,這裡就解釋一下二進位制走法,首先__builtin_popcount函式是用來統計乙個數表示成二進位制時有幾個1,由於每次只能從i->2^i,所以從a[i]->a[j]如果走二進位制走法的話就是__builtin_popcount(a[j]-a[i])步,為什麼呢?舉個例子a[j]-a[i]=1010,那麼是不是可以表示為10+1000,這樣看是不是其實就是統計一下二進位制1的個數。
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
1e5+5;
struct cxks[maxn]
;int n,k,a[maxn]
,d[maxn]
,m=0
,tot=0;
intmain()
a[tot++]=
1;a[tot++
]=n;
sort
(a,a+tot)
;memset
(d,0x3f
,sizeof
(d))
;int x=
unique
(a,a+tot)
-a; d[0]
=0;for
(int i=
0;i++i)
for(
int j=i+
1;j++j)
printf
("%d\n"
,d[x-1]
);}
牛客14369之最短路(SPFA模板)
簡單暴力的題目要求 給定乙個有n個頂點 從1到n編號 m條邊的有向圖 其中某些邊權可能為 負,但保證沒有負環 請你計算從1號點到其他點的最短路。第一行兩個整數n,m。接下來的m行,每行有三個整數u,v,l,表示u到v有一條長度為l的邊。共n 1行,第i行表示1號點到i 1號點的最短路。3 3 1 2...
牛客 十二橋問題 (最短路 狀態壓縮)
小多所在的城市可以看成是有n個點m條邊的無向圖 結點從1標號 每條邊有乙個距離di,其中有k條邊是小希特別想走過的k座大橋。小多和小希現在呆在1號結點,請你幫小多規劃一條最短路線,使得小多和小希能從當前位置出發,並經過這k座橋,最後回到結點1。第一行輸入三個數n,m,k,分別表示結點數目,邊數和小希...
牛客練習賽24 D 插排樹(最短路練習)
插排樹時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 一年一度的山東省oi夏令營又開始了,每到這個季節,山東的oier們都會歡聚這裡,一起學 tu 習 fe 當然,為了能更加愉快地學 tu 習 fe 就少不了要自帶電...