牛客 D 炫酷路途(貪心 最短路)

2021-10-21 22:57:12 字數 1500 閱讀 4168

題目描述

小希現在要從寢室趕到機房,路途可以按距離分為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 就少不了要自帶電...