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 }
考虑下经过一个加油站就是增加了一个加油的机会 那么我们尝试不加油继续往前走 走到没有了 看看能经过多少加油站 然后从里面选择加油最多的那个机会 加油 再继续前行
这是很显然的贪心策略 既然要加油次数最少 那么在能加油的机会里贪心选择即可.未细加证明 但是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 }
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2017-12-09 c++11 初始化列表 bind function 示例