有點難度的貪心題,貪心策略有點繞,得靜下心來分析,同時得增強自己的代碼能力。實質是汽車加油問題。
貪心策略:假設現在自己處於A站,要考慮的是A站要不要加油,加多少油的問題。找到下一個要加油的站B(距離A站cmax*davg範圍內的最便宜的站)。
1. A站油價比B價高,現在油箱裏還有油,能跑到B站,那就不加油,直接跑去(這裏B站跟2,3情況不同,是距離A站currGas*davg範圍內的最便宜的站)
2. A站油價比B價高,現在油箱沒油,跑不到B站,爲了減少花銷,儘量少加油,只加能跑到B站的油。
3. A站油價比B價低,則不管油箱有沒有油,跑不跑得到B站,儘量加滿油。
AC代碼:
//1033 20:23
#include<cstdio>
#include<cstdlib>
const int NUM=505;
const int INF=0x7fffffff;
struct station
{
double price;
double dist;
}s[NUM];
int cmp(const void *a,const void *b)
{
station *x=(station *)a;
station *y=(station *)b;
return x->dist - y->dist;
}
int main()
{
int i,j,n,davg;
int flag=1,index;
double dest,cmax;
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
scanf("%lf%lf%d%d",&cmax,&dest,&davg,&n);
for(i=0;i<n;i++){
scanf("%lf%lf",&s[i].price,&s[i].dist);
}
s[n].price=0;
s[n].dist=dest;
double step=cmax*davg;
double currGas=0;
double minPrice,sum=0;
qsort(s,n,sizeof(s[0]),cmp);
if(s[0].dist>0){
printf("The maximum travel distance = 0.00\n");
return 0;
} else {
for(i=0;i<n;){
if(s[i+1].dist-s[i].dist>step){
flag=0;
printf("The maximum travel distance = %.2lf\n",s[i].dist+step);
break;
} else {
index=i;
minPrice=s[i].price;
//1.現在有油,
for(j=i+1;s[j].dist-s[i].dist<=currGas*davg&&j<=n;j++){//找現有油箱能跑到的比現在最便宜的油站
if(s[j].price<minPrice){
index=j;
minPrice=s[j].price;
}
}
if(index!=i){//現在有油,找到了比現在油站價格最便宜的油站(不加油能到),就直接開過去,不加油,到那再加
currGas-=(s[index].dist-s[i].dist)/davg;//耗油
i=index;
continue;
}
index=i;
//minPrice=s[i].price;
//2.現在沒油或所能到的油站價格都比現在油站貴
for(j=i+1;s[j].dist-s[i].dist<=step&&j<=n;j++){//找最近的比現油站便宜的油站
if(s[j].price<minPrice){
index=j;
break;
}
}
if(index!=i){//現在沒油或現油箱所能到的油站價格都比現在油站貴:要去最近的比現油站便宜的油站(不加油到不了),得在現油站加上剛好滿足的油量
sum+=((s[index].dist-s[i].dist)/davg-currGas)*s[i].price;
currGas=0;
//printf("%.2lf\n",sum);
i=index;
continue;
}
//3.現在有油或沒油,沒找到比現在便宜的油站,當然是在現油站加滿,再到下一個次便宜的油站
index=i;
minPrice=INF;
for(j=i+1;s[j].dist-s[i].dist<=step&&j<=n;j++){//找接下來step範圍內的最便宜油站
if(s[j].price<minPrice){
index=j;
minPrice=s[j].price;
}
}
sum+=(cmax-currGas)*s[i].price;//沒找到比現在便宜的油站,當然是在現油站加滿,再到下一個次便宜的油站
currGas=cmax-(s[index].dist-s[i].dist)/davg;
//printf("%.2lf\n",sum);
i=index;
}
}
}
if(flag==1)
printf("%.2lf\n",sum);
return 0;
}