加油站的建造位置必須使加油站與距離它最近的房屋的距離盡可能遠。
與此同時,它還必須保證所有房屋都在其服務範圍內。
現在,給出了城市地圖和加油站的幾個候選位置,請你提供最佳建議。
如果有多個解決方案,請輸出選取位置與所有房屋的平均距離最小的解決方案。
如果這樣的解決方案仍然不是唯一的,請輸出選取位置編號最小的解決方案。
輸入格式
第一行包含四個整數 nn,房屋總數,mm,加油站的候選位置總數,kk,連線房屋或加油站的道路總數,dsds 加油站的最大服務範圍。
所有房屋的編號從 11 到 nn,所有加油站侯選位置編號從 g1 到 gm。
接下來 kk 行,每行格式如下:
p1 p2 dist
其中,p1 和 p2 表示一條 無向 道路連線的兩個房屋或加油站侯選位置的編號,dist 是道路長度,這是乙個整數。
輸出格式
第一行輸出所選位置的編號。
第二行輸出加油站與距離其最近的房屋之間的距離以及與所有房屋之間的平均距離,精確到小數後一位。
如果解決方案不存在,則輸出 no solution。
資料範圍
1≤n≤1031≤n≤103,
1≤m≤101≤m≤10,
1≤k≤1041≤k≤104,
1≤ds≤2001≤ds≤200,
1≤dist≤50001≤dist≤5000
輸入樣例1:
4 3 11 5
1 2 2
1 4 2
1 g1 4
1 g2 3
2 3 2
2 g2 1
3 4 2
3 g3 2
4 g1 3
g2 g1 1
g3 g2 2
輸出樣例1:
g12.0 3.3
輸入樣例2:
2 1 2 10
1 g1 9
2 g1 20
輸出樣例2:
no solution
#include
using
namespace std;
const
int n=
1020
,inf =
0x3f3f3f3f;;
int n,m,k,d;
int dist[n]
,st[n]
,g[n]
[n];
intgetid
(string a)
i++;}
if(a[0]
=='g'
)return n+id;
else
return id;
}void
dijiskstra
(int s,
int&mind,
int&sumd)
if(t==-1
)break
; st[t]=1
;for
(int v=
1;v<=n+m;v++)}
for(
int i=
1;i<=n;i++)}
mind = inf, sumd =0;
for(
int i =
1; i <= n; i ++)}
intmain()
int res=-1
,mind=
0,sumd=inf;
for(
int i=n+
1;i<=n+m;i++)if
(res ==-1
)puts
("no solution");
else
printf
("g%d\n%.1f %.1f\n"
, res - n,
(double
)mind,
(double
)sumd / n +
1e-8);
return0;
}
134 加油站(中等題)
題目描述 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas i 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i 1 個加油站需要消耗汽油 cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 1。...
PAT甲級真題1153
pat 准考證號由 44 部分組成 第 11 位是級別,即 t 代表頂級 a 代表甲級 b 代表乙級 第 2 42 4 位是考場編號,範圍從 101101 到 999999 第 5 105 10 位是考試日期,格式為年 月 日順次各佔 22 位 最後 11 1311 13 位是考生編號,範圍從 00...
「加油站」優先佇列貪心3題
概括起來就是前m個里一定有n個的問題,可以追溯到很經典的乙個題 一輛車經過幾個加油站,每個加油站有 不同的一定量油,開車要消耗油,問至少多少錢到終點。做法就是先假裝不加,油不夠了再往前面找最便宜的加油站加,用乙個優先佇列維護即可。這類題的難點在於抽象出這個模型往往隱藏得很深,要看出來才行。inclu...