| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 1342 人关注过本帖
标题:[求助]北大一道贪心题[已解决,谢谢大家]
收藏  订阅  推荐  打印 
davidloves
Rank: 2
等级:注册会员
帖子:137
积分:1478
注册:2007-1-6
[求助]北大一道贪心题[已解决,谢谢大家]

http://acm.pku.edu.cn/JudgeOnline/problem?id=2431
一直通不过,麻烦有兴趣的朋友一起探讨一下

我是这样想的:
1:每次在当前站都往前走到油用完,然后看途经了几个站
2:如果达到终点,那么就输出停下的站数
3:如果没到终点 并且 途经 0 个站,则表示不能到达,输出-1
4:如果没到终点 并且 途径N 个站,那么选取在这几个站中,加了油后能走得最远的
为当前站,然后执行第1步

一直WA,是不是这个算法错了

[此贴子已经被作者于2007-10-15 18:51:51编辑过]

搜索更多相关主题的帖子: 北大  贪心  
2007-10-14 15:27
davidloves
Rank: 2
等级:注册会员
帖子:137
积分:1478
注册:2007-1-6

自己顶一下


2007-10-14 15:45
cobby
Rank: 4
等级:高级会员
威望:1
帖子:562
积分:5988
注册:2007-7-11

当公务员后N久没搞ACM了,不过帮着看下呵,如果有思路和你讨论一下呵

努力成为菜鸟!
2007-10-14 17:13
cobby
Rank: 4
等级:高级会员
威望:1
帖子:562
积分:5988
注册:2007-7-11

算法好像是有点问题。

先确认一下,题目中说“The truck now leaks one unit of fuel every unit of distance it travels”,
sample输入中,最近的加油站和卡车距离10,而当前卡车载油也是10,怎么可能到达这个加油站呢?


个人认为这个问题不适合用贪心算法,因为有可能得不到最优解,可以试着用动态规划试试。这是一个组合优化问题。


努力成为菜鸟!
2007-10-14 17:44
Eastsun
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:32
帖子:801
积分:8540
注册:2006-12-14

贪心没错,但不是这样贪的.
下面是我通过的代码:

程序代码:

<BR>/**<BR> &amp;#pku2431.cpp<BR> @author Eastsun<BR> @version 1.0 2007/10/14<BR>*/<BR>#include&lt;iostream&gt;<BR>#include&lt;queue&gt;<BR>#include&lt;vector&gt;<BR>#include&lt;algorithm&gt;<BR>#include&lt;functional&gt;<BR>using namespace std;</P> <P>struct Stop{<BR> Stop(int d,int f){<BR> dis =d;<BR> fuel =f;<BR> }<BR> int dis;<BR> int fuel;<BR>};<BR>struct CmpByDis:public binary_function&lt;Stop,Stop,bool&gt;{<BR> bool operator()(const Stop&amp; s1,const Stop&amp; s2)const{<BR> return s1.dis &gt;s2.dis;<BR> }<BR>};<BR>struct CmpByFuel:public binary_function&lt;Stop,Stop,bool&gt;{<BR> bool operator()(const Stop&amp; s1,const Stop&amp; s2)const{<BR> return s1.fuel &lt;s2.fuel;<BR> }<BR>};<BR>int main(){<BR> int n;<BR> cin&gt;&gt;n;<BR> vector&lt;Stop&gt; vec;<BR> for(int i =0;i &lt;n;i ++){<BR> int d,f;<BR> cin&gt;&gt;d&gt;&gt;f;<BR> vec.push_back(Stop(d,f));<BR> }<BR> int dist,fuel,count =0;<BR> cin&gt;&gt;dist&gt;&gt;fuel;<BR> sort(vec.begin(),vec.end(),CmpByDis());<BR> priority_queue&lt;Stop,vector&lt;Stop&gt;,CmpByFuel&gt; queue;<BR> vector&lt;Stop&gt;::iterator itr =vec.begin();<BR> for(;;){<BR> for(;itr!=vec.end()&amp;&amp;fuel&gt;=dist -(*itr).dis;itr ++)<BR> queue.push(*itr);<BR> if(queue.empty()){<BR> cout&lt;&lt;-1&lt;&lt;endl;<BR> break;<BR> }<BR> if(fuel&gt;=dist){<BR> cout&lt;&lt;count&lt;&lt;endl;<BR> break;<BR> }<BR> fuel += queue.top().fuel;<BR> queue.pop();<BR> count ++;<BR> }<BR>}<BR>


My BlogClick Me
2007-10-14 18:13
cobby
Rank: 4
等级:高级会员
威望:1
帖子:562
积分:5988
注册:2007-7-11

楼上的能说下算法思想吗?怎么个贪法?

努力成为菜鸟!
2007-10-14 18:14
Eastsun
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:32
帖子:801
积分:8540
注册:2006-12-14

就是在能够到达的加油站里面选择一个油量最大的加油.
然后再在能够到达的加油站里面选择一个油量最大的加油.
...
直到能够到达终点,或者到达不了任何加油站.

My BlogClick Me
2007-10-14 18:17
cobby
Rank: 4
等级:高级会员
威望:1
帖子:562
积分:5988
注册:2007-7-11

这个算法我开始就考虑过,应该是行不通的。你的程序确实通过了?

努力成为菜鸟!
2007-10-14 19:41
davidloves
Rank: 2
等级:注册会员
帖子:137
积分:1478
注册:2007-1-6
回复:(cobby)这个算法我开始就考虑过,应该是行不通...

这个算法经过鉴定:
神州行,我看行

果然是高手,哦也


2007-10-14 20:33
mebol
Rank: 1
等级:新手上路
帖子:39
积分:490
注册:2007-10-7

你们说的是C吗?我怎么看不懂。我是菜鸟!
2007-10-14 20:50
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.060608 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved