NOIP 模擬練習題 收費站

2021-07-09 16:35:42 字數 1967 閱讀 5813

4.收費站

(cost.pas/c/cpp)

【問題描述】

在某個遙遠的國家裡,有n個城市。編號為1,2,3,……,n。

這個國家修建了m條雙向的公路。每條公路連線著兩個城市。沿著某條公路,開車從乙個城市到另乙個城市,需花費一定的汽油。

開車每經過乙個城市,都會收取一定的費用(包括起點和終點城市)。所有的收費站都在城市中,在城市間的公路上沒有任何的收費站。

小紅現在要開車從u城市到v城市(1≤u,v≤n)。她的車最多可以裝下s公升汽油。在出發的時候,車的郵箱是滿的,並且她在路上不想加油。

在路上,每經過乙個城市,她要交一定的費用。如果他每次交的費用比較多,她的心情就會變得很糟。所以她想知道,在她能到達目的地的前提下,她交的費用中最多的一次最少是多少。這個問題對他來說太難了,於是她找到聰明的你,你能幫幫她嗎?

【輸入】

第一行5個正整數,n,m,u,v,s,分別代表有n個城市,m條公路,從城市u到城市v,車的油箱容量為s公升。

接下來有n行,每行乙個正整數,fi,表示經過城市i,需要交費fi元。

再接下來有m行,每行三個正整數,ai,bi,ci(1≤ai,bi≤n),表示城市ai和城市bi之間有一條公路,如果從城市ai到城市bi,或者從城市bi到城市ai,需要ci公升汽油。

【輸出】

僅乙個整數,表示小紅交費最多的一次的最小值。如果他無法到達城市v,輸出-1.

【輸入輸出樣例1】

cost.in

cost.out

3        4  2  3  8

2        1  2

2        4  1

1        3  4

3  4  3

【輸入輸出樣例2】

cost.in

cost.out

4  4  2  3  3

2        1  2

2        4  1

1        3  4

3  4  3

-1

#include#include#include#include#include#includeusing namespace std;

queue q;

int n,m,s,t,v;

int maxw,minw=1e9+1;

struct edge_

edge[100005];

struct node_

node[10005];

int d[10005];bool vis[10005];

int et;

void add(int u,int v,int w)

bool spfa(int x)

int tmp=d[v];

d[v]=min(d[v],d[u]+edge[b].w);

if (d[v]!=tmp&&vis[v]==false)

b=edge[b].next;}}

} if (d[t]<=v) return true;

else return false;

}void erfen(int l,int r)

for (i=1;i<=m;i++)

if (spfa(1000000005)==0) cout<<"-1";

else erfen(minw,maxw);

return 0;

}

【限制】

對於60%資料,滿足n≤200,m≤10000,s≤200

對於100%資料,滿足n≤10000,m≤50000,s≤1000000 000

對於100%資料,滿足ci≤1000 000 000,fi≤1000 000 000,可能有兩條邊連線著相同的城市。

二分答案+最短路

練習題 時鐘模擬

6 12 時鐘模擬 30分 乙個time類,資料成員有時 分 秒。要求模擬秒錶,每次走一秒,滿60秒進製,秒又從零開始計數。滿60分進製,分又從零開始計數。輸出時 分和秒的值。使用過載 運算子實現 class mytime 請在這裡填寫答案 int main mytime operator frie...

口算練習題 模擬演算法

題目描述 王老師正在教簡單算術運算。細心的王老師收集了i道學生經常做錯的口算題,並且想整理編寫成乙份練習。編排這些題目是一件繁瑣的事情,為此他想用電腦程式來提高工作效率。王老師希望儘量減少輸入的工作量,比如5 8的算式最好只要輸入5和8,輸出的結果要盡量詳細以方便後期排版的使用,比如對於上述輸入進行...

1007 數字邏輯練習題(模擬)

時間限制 1 sec 記憶體限制 128 mb 提交 264 解決 59 提交 狀態 討論版 原碼 反碼 補碼都是一樣的,都是正數本身。對於負數 原碼是符號位為 1,數值部分取絕對值的二進位制。反碼是符號位為 1,其它位是原碼取反。補碼是符號位為 1,其它位是原碼取反,未位加 1。輸入乙個 64bi...