zoukankan      html  css  js  c++  java
  • poj 2431 Expedition 贪心 优先队列 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=2431

        

     

    题解

    朴素想法就是dfs 经过该点的时候决定是否加油 中间加了一点剪枝 如果加油次数已经比已知最少的加油次数要大或者等于了 那么就剪枝

    然而 还是TLE了

    TLE代码

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 
     6 using namespace std;
     7 
     8 vector<pair<int, int>> dis_fuel(10010);
     9 
    10 int n;
    11 int L, P;
    12 
    13 int ret = 999999;
    14 
    15 void dfs(int idx,int currAddCount)
    16 {
    17     if (idx == n) {
    18         ret = min(ret, currAddCount);
    19         return;
    20     }
    21 
    22     if (currAddCount >= ret) return;
    23 
    24     if (P + dis_fuel[idx].first >= L) {
    25         //当前的油 可以到达 那么选择加油不加油
    26 
    27         P += dis_fuel[idx].second;
    28         dfs(idx+1, currAddCount+1);
    29 
    30         P -= dis_fuel[idx].second;
    31         dfs(idx + 1, currAddCount);
    32     }
    33 
    34     return;
    35 }
    36 
    37 
    38 int solve()
    39 {
    40     cin >> n;
    41 
    42     for (int i = 0; i < n; i++) {
    43         cin >> dis_fuel[i].first >> dis_fuel[i].second;
    44     }
    45     cin >> L >> P;
    46 
    47     sort(dis_fuel.begin(), dis_fuel.begin() + n, greater<pair<int, int>>());
    48     
    49     dfs(0,0);
    50 
    51     if (ret == 999999) ret = -1;
    52     return ret;
    53 }
    54 
    55 int main()
    56 {
    57     cout << solve() << endl;
    58 
    59     return 0;
    60 }
    TLE!!!

    考虑下经过一个加油站就是增加了一个加油的机会 那么我们尝试不加油继续往前走 走到没有了 看看能经过多少加油站 然后从里面选择加油最多的那个机会 加油 再继续前行

    这是很显然的贪心策略 既然要加油次数最少 那么在能加油的机会里贪心选择即可.未细加证明 但是AC了 说明思路是正确的

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 
     6 using namespace std;
     7 
     8 vector<pair<int, int>> dis_fuel(10010);
     9 
    10 int n;
    11 int L, P;
    12 
    13 
    14 int solve()
    15 {
    16     cin >> n;
    17 
    18     for (int i = 0; i < n; i++) {
    19         cin >> dis_fuel[i].first >> dis_fuel[i].second;
    20     }
    21     cin >> L >> P;
    22 
    23     int ret = 0;
    24     sort(dis_fuel.begin(), dis_fuel.begin() + n, greater<pair<int, int>>());
    25     priority_queue<int, vector<int>,less<int>> que;
    26 
    27     for (int i = 0; i < dis_fuel.size(); i++) {
    28         if (dis_fuel[i].first + P >= L) {
    29             que.push(dis_fuel[i].second);
    30         }
    31         else {
    32             while (!que.empty() && dis_fuel[i].first + P < L) {
    33                 ret++;
    34                 P += que.top();
    35                 que.pop();
    36             }
    37             if (dis_fuel[i].first + P < L) return -1;
    38             que.push(dis_fuel[i].second);
    39         }
    40     }
    41 
    42     if (P < L) return -1;
    43     return ret;
    44 }
    45 
    46 int main()
    47 {
    48     cout << solve() << endl;
    49 
    50     return 0;
    51 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    HDU 5058 So easy
    HDU 1392 Surround the Trees(几何 凸包模板)
    HDU 4500 小Q系列故事——屌丝的逆袭(简单题)
    HUD 5050 Divided Land
    HDU 5047 Sawtooth(大数优化+递推公式)
    http://www.rabbitmq.com/
    安装及运行 RabbitMQ 服务器 (linux) 失败! 安装erlang 失败,无法继续
    安装及运行 RabbitMQ 服务器 (windows)
    RabbitMQ client ( java )
    task:scheduled cron 合法
  • 原文地址:https://www.cnblogs.com/itdef/p/12012893.html
Copyright © 2011-2022 走看看