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; }
相关文章推荐
- 【C++】PAT (advanced level)1033. To Fill or Not to Fill (25)*
- 1033. To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)解题报告
- 1033. To Fill or Not to Fill (25)-PAT
- 1033. To Fill or Not to Fill (25)
- PAT (Advanced Level) Practise 1033 To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)-PAT甲级真题
- 1033. To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25) -贪心算法
- 1033. To Fill or Not to Fill (25)
- 1033 . To Fill or Not to Fill (25) (想明白了没写出来,参考吧)
- 1033. To Fill or Not to Fill (25) -贪心算法
- 1033. To Fill or Not to Fill (25)
- PAT (Advanced Level) Practise 1033 To Fill or Not to Fill (25)
- 1033.To Fill or Not to Fill (25)
- 1033. To Fill or Not to Fill (25)