牛客 追債之旅 兩種解法

2021-10-24 00:26:51 字數 3252 閱讀 5409

一共兩種解法,所以即便你不會最短路,也可以做,甚至爆搜+剪枝的時間和空間消耗小於最短路做法。

題意:

小明現在要追討一筆債務,已知有n座城市,每個城市都有編號,城市與城市之間存在道路相連(每條道路都是雙向的),經過任意一條道路需要支付費用。小明一開始位於編號為1的城市,欠債人位於編號為n的城市。小明每次從乙個城市到達另乙個城市需要耗時1天,而欠債人每天都會揮霍一定的錢,等到第k天後(即第k+1天)他就會離開城n並再也找不到了。小明必須要在他離開前抓到他(最開始為第0天),同時希望自己的行程花費和欠債人揮霍的錢的總和最小,你能幫他計算一下最小總和嗎?

題解:

dij的乙個變式題,只需要,雖然這只是乙個變式題,但我還真沒想出來,看了題解才會的。。。

只需要把visited和dis這兩個陣列多開出一維空間來維護一下第幾天走到的哪個點即可。

最後遍歷一邊 1到k天,所有dis[n]的值,取最小的即可。

**:

/*keep on going never give up*/

#pragma gcc optimize(3,"ofast","inline")

#include

#define endl '\n'

#define ios std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);

//#define int long long

const

int maxn =

2e4+10;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int mod =

1e9+7;

using

namespace std;

bool visited[

1010][

1010];

struct wazxyedge[maxn]

;int head[maxn]

,dis[

1010][

1010

],cnt=1;

int n,m,k;

int p[maxn]

;inline

void

add(

int u,

int v,

int w)

struct node

bool

operator

<

(const node & a)

const};

void

dij()}

}}intmain()

for(

int i=

1;i<=k;i++

)memset

(visited,

false

,sizeof visited)

;memset

(dis,maxn,

sizeof dis)

;dij()

;int ans=maxn;

for(

int i=

1;i<=k;i++)if

(ans==maxn) cout<

;else cout<

return0;

}

上面是爆搜+剪枝

下面是正解

爆搜加剪枝你值得擁有。

if

(sum>=ans)

return;if

(sum>=ans)

return;if

(sum>=ans)

return

;

對加了這句話,就ok了。

爆搜的**也不需要多解釋了,今天突然想起來剪枝一下好像可以就試了試。

其實就是dfs暴力所有路徑。。。加了乙個再普通不過的剪枝。

**:

/*keep on going never give up*/

#pragma gcc optimize(3,"ofast","inline")

#include

#define endl '\n'

#define ios std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);

//#define int long long

const

int maxn =

2e4+10;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int mod =

1e9+7;

using

namespace std;

bool visited[

1010];

struct wazxyedge[maxn]

;int head[maxn]

,cnt=1;

int n,m,k;

int p[maxn]

,ans;

inline

void

add(

int u,

int v,

int w)

void

dfs(

int x,

int sum,

int d)

if(sum>=ans)

return;if

(d>k-1)

return

;for

(int i=head[x]

;i;i=edge[i]

.next)}}

intmain()

for(

int i=

0;i)memset

(visited,

false

,sizeof visited)

; ans=maxn;

dfs(1,

0,0)

;if(ans==maxn) cout<

;else cout<

return0;

}

牛客網 兩種排序方法

解題思路 思路很簡單,將接受的字串都放到vector容器中,利用string的operator 運算子過載來按ascii比較字串,利用string的size來比較字串的長度.根據字典排序即根據阿斯克嗎值排序 include include include using namespace std 長度...

Bacon Number 兩種解法

view code 題目 cid 567 題目分析 與longth way 類似 這個好象就是傳說中的六度人脈,你只要通過六度人脈就可以找到世界上的任何乙個人。假設乙個人一生會認識n個人,那n n 1 n 2 n 3 n 4 n 5 n 6 世界總人數。給定一些邊確定乙個圖,即給定一些點之間的連通情...

The Longest Path 兩種解法

view code 題目 cid 567 題目分析 給定一些邊確定乙個圖,即給定一些點之間的連通情況,保證給定的圖沒有迴路,要求輸出該圖存在的最長路徑。思路分析 根據給定資訊構造圖,用鄰接表表示。鄰接矩陣明顯很麻煩且效率不高 將每乙個頂點看成是樹根,求出樹的高度。得到一系列樹的高度,最大的那個就是圖...