乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1、汽車油箱的容量c(以公升為單位)、每公升汽油能行駛的距離d2、出發點每公升汽油**p和沿途油站數n(n可以為零),油站i離出發點的距離di、每公升汽油**pi(i=1,2,…,n)。計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出「no solution」。
輸入格式:
第一行,d1,c,d2,p,n。
接下來有n行。
第i+1行,兩個數字,油站i離出發點的距離di和每公升汽油**pi。
輸出格式:
所需最小費用,計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出「no solution」。
看好多人用佇列做的,然而並不想用
可以這樣想,每次遇到加油站就把油箱裡的「貴油」賣掉,再把油箱加滿地溝油。得出的結果是一樣的。
為了方便判斷油的**,rk[x]表示第x個油站的**排名,bag[x]表示排名為x的油在油箱裡有多少,注意細節模擬就可以了
#include#include#include
using
namespace
std;
const
int maxn = 10
;struct
station
} s[maxn];
struct
oil ;
intn;
double
cub,ech,ans;//分別是油箱容量,每公升油跑多遠,共多少錢
double
p[maxn],dis[maxn],bag[maxn];//** 離起點的距離 油箱
intrk[maxn];
intmain()
}sort(s+1,s+1+n);
for(int i = 1;i <= n;i++)
//for(int i = 1;i <= n;i++)
for(int i = 1;i <= n+1;i++)
}if(i == n+1) break
;
for(int j = 1;j <= n;j++)
tot +=bag[rk[j]];
}bag[rk[i]] += cub -tot;
ans += (cub-tot) *p[i];
//for(int j = 1;j <= n;j++) printf("%.2lf ",bag[j]);
//cout<<" with ans is: "<}
for(int i = 1;i <= n;i++) ans -= bag[rk[i]] *p[i];
printf(
"%.2lf\n
",ans);
return0;
}
Luogu P1016 旅行家的預算
首先將起點和終點與道路上的加油站視為等價節點,按照距離起點的距離 即通過順序 排序。然後對於每乙個節點我們可以進行以下貪心策略 注 讀入的時候一定要看一下引用的變數被賦值了沒!include define n 10 using namespace std int n double d1,c,d2,a...
luogu P1016 旅行家的預算 貪心
luogu p1016 旅行家的預算 題目描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 ...
P1016 旅行家的預算
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1d1 汽車油箱的容量cc 以公升為單位 每公升汽油能行駛的距離d2d2 出發點每公升汽油 pp和沿途油站數nn nn可以為零 油站ii離出發點的距離didi 每公升汽油 pipi i 1,2,ni...