您的位置:首页 > 其它

1033. To Fill or Not to Fill (25)

2013-03-12 10:14 375 查看
加油事件的贪心选择模拟

#include<iostream>
#include<vector>
#include<algorithm>

typedef struct Station
{
double dis;
double price;
bool operator<(const Station& other) const
{
return dis < other.dis;
}
}Station;

double unit_gas;
int FindNeatestCheaperStation(int i, double gas, std::vector<Station>& s)
{
int num = s.size();
int min_index = i;
for(int j = i+1; j < num && s[j].dis-s[i].dis <= gas*unit_gas; ++j)
{
if(s[j].price < s[min_index].price)
{
min_index = j;
break;
}
}
return min_index;
}

int GetFastestStation(int i, double gas, std::vector<Station>& s)
{
int num = s.size();
int max_index = i;
for(int j = i+1; j < num && s[j].dis-s[i].dis <= gas*unit_gas; ++j)
{
max_index = j;
}
return max_index;
}

int main()
{
double max_gas, total_dis;
int n;
while(scanf("%lf%lf%lf%d",&max_gas,&total_dis,&unit_gas,&n)!=EOF)
{
std::vector<Station> sVec(n);
for(int i = 0; i < n; ++i)
scanf("%lf %lf",&sVec[i].price,&sVec[i].dis);
//sort station by distance
std::sort(sVec.begin(), sVec.end());
Station vir;
vir.dis = total_dis;//add destination as a virtual station in the end
sVec.push_back(vir);
//algorithm core
if(n==0 || sVec[0].dis > 0)//special case
printf("The maximum travel distance = 0.00\n");
else//greedy now
{
double remain_gas = 0.0;
double cur_money = 0.0;
int i;
for(i = 0; i < n; )
{
int index;
//1. using remain gas find nearest cheaper station
index = FindNeatestCheaperStation(i, remain_gas, sVec);
if(index != i)//find a station else
{//get there
remain_gas -= (sVec[index].dis-sVec[i].dis)/unit_gas;
i = index;
continue;
}
//2. using max_gas find nearest cheaper station
index = FindNeatestCheaperStation(i, max_gas, sVec);
if(index != i)//find a station else
{//get there
cur_money += ((sVec[index].dis-sVec[i].dis)/unit_gas-remain_gas)*sVec[i].price;
remain_gas = 0.0;
i = index;
continue;
}
//3. get the max_gas and go as far as possible
index = GetFastestStation(i, max_gas, sVec);
if(index != i)
{//can get some where
cur_money += (max_gas-remain_gas)*sVec[i].price;
remain_gas = max_gas-(sVec[index].dis-sVec[i].dis)/unit_gas;
i = index;
continue;
}
else
{
printf("The maximum travel distance = %.2lf\n", sVec[i].dis+max_gas*unit_gas);
break;
}
}//end of greedy
if(i == n) printf("%.2lf\n", cur_money);
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: