题解 | #To Fill or Not to Fill#

To Fill or Not to Fill

http://www.nowcoder.com/practice/f7eba38f7cd24c45982831e0f38518f9

贪心:目标是花费最少,就从“油价”开始“贪”。

将加油站按油价升序排列,依次遍历,

让油价低的加油站出发走尽可能多的路,即走Cmax*Davg,走过的路在路程数组上标记一下,

若从一个加油站出发到最大距离之间有部分已经被走过,则去掉,剩下这段路按该加油站油价收费。

最后若路程数组还有未标记的路段,即没走完,说明不可达。


#include<bits/stdc++.h>
using namespace std;
int main(){
    int Cmax = 0, D = 0, Davg = 0, N = 0;
    double Pi = 0.00;
    int Di = 0;
    multimap<double, int> stations;//加油站:油价 距离
    double res = 0.00;
    while(cin >> Cmax >> D >> Davg >> N){
        stations.clear();
        for(int i = 0; i < N; i++){
            cin >> Pi >> Di;
            stations.emplace(Pi, Di);
        }
        bool* way = new bool[D];//路程数组
        for(int i = 0; i < D; i++)
            way[i] = false;
        /*
        贪心:目标是花费最少,就从“油价”开始“贪”。
        将加油站按油价升序排列,依次遍历,
        让油价低的加油站出发走尽可能多的路,即走Cmax*Davg,走过的路在路程数组上标记一下,
        若从一个加油站出发到最大距离之间有部分已经被走过,则去掉,剩下这段路按该加油站油价收费。
        最后若路程数组还有未标记的路段,即没走完,说明不可达。
        */
        res = 0.00;
        //map默认按油价排序
        for(auto iter = stations.begin(); iter != stations.end(); iter++){
            int dis = 0;//该油站的油所行路程
            for(int i = iter->second; i < iter->second+Cmax*Davg && i < D; i++){
                if(way[i] == false){//未被走过
                    dis++;
                    way[i] = true;
                }
            }
            res += dis * iter->first / Davg;
        }
        //检查路是否走完
        bool finish = true;
        for(int i = 0; i < D; i++)
            if(way[i] == false){//不可达
                cout << "The maximum travel distance = " << i << ".00" << endl;
                finish = false;
                break;
            }
        
//         if(finish)printf("%.2lf\n", res);
        cout.setf(ios::fixed);
        if(finish)cout << setprecision(2) << res << endl;
        
        delete[] way;
    }
    return 0;
}

全部评论

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务