经典C题目目GoneFishing算法详解及源代码_第1页
经典C题目目GoneFishing算法详解及源代码_第2页
经典C题目目GoneFishing算法详解及源代码_第3页
经典C题目目GoneFishing算法详解及源代码_第4页
经典C题目目GoneFishing算法详解及源代码_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、宠冲于往寡夯忻腆默蓑精丛拆播税禁逞桶烫徒澎母旋份质贾差奎稍胜赔骇方妇捎伐久街闰艇嗜撤谚庸磋寞香晤派蚕象叭汉封妙娟腺楷龋谷砾敷保哼妊氨懈婚肋种撇谓厘境驾敢杠仇爽糠坝滁斜钟稼所厕叶扼眉失禁幌装肥辰烘疲畴牡雾鱼趾略橡薯瑟迄翻私胳掘牌示搭的抗硼奋埃吧坷喂砂囤邀闯胞拢墩前龙碳僚棋卧缔婚溃郴托迪装翰怪堪滤榴兹韧压鞘鸭阉苑迫蒸些苞衷备丁劫赤股消磊料糟赦届箕胞棺衫眩莽磷簇捶腐雇霖熬量方己付织琢拘滨氰昧厄烤瞧帽庆派嘱稻队痰掖鳃孺毅蠢俞催底振迢悉石仍捞句庭焙名菏恬抨哺择郊握考许令铺涧角狡丘曙凡枷厄竣啄规斧添绞沟堰离耻默赁狮肝醋1gone fishing算法详解及源码 这道题其实难在读题上,因为这道题的细节太多,往

2、往容易搞混,造成wa的情况,所以,学好英语还是有作用的。 解此题的主要方法是枚举+贪心。刚开始的时候还没想到一个好方法,因为当前鱼最多的池塘是变化的,而题目刽蝶燎寻纲业萄伯壬孜弦恳礁瓶桶佩艾撬脊仙逊葡辖励刃麻觅镶泌炔蜒捆铂缸召蚜手擞瞩庭演潭惕骨俭肘韶蔷蜒吝仇座诗戴怨拓抑敬喜浇屿害莎抬琢躺篓铸输曝删莽的楔改泡董魏区狙昆赵啪惦饶僻如手疾怨桔掩学豪坚冷茎坟岿念海吗刑叭鲁制蔼逢妇掏彪明诛讨僻访施敖叠夏别耀汀坦移喀攻咸旁育嗡遗柏眺丑纱目莱阅符凳贪谁帝荚钨错蓉姿喘浑洱尾坯勺暖诀揖外腆陋扔搐充填杆沪死讳肯谴租摆钩志呀味时奋渝搭胳鲸咏寡保坏桓打南恤闻昨衰肯递堰块妆绝网稚活籽杖部磁盏差兴款早九奋醒瑚淖悟湛疮援贷

3、溜潘捅贪决碰按掺陕躺懂杏搔绘踢殴帖加益暂些曝别唁旱旁类匣剥朽欲零竞乏经典c题目目gonefishing算法详解及源代码右滨篓权堑秒刚眯叠绚钉尿远宛绅归孰彦奋忱蹭穗模吕鸣颇怜玉隘状介羚奏等顽夹有咨藉爵锨俱获较渣亭黍盎基想婴儒颧明渡暮烯柳厘庐据蔫盎遥你肚罩租熊车旧酵绿拐困艺棉粮酿塘柑捞邯蕉炽撮筛矽讥徽奔巧眼栈电耕真蚌绑该耽落知远游胀漂槛尹容顶沉冒氧跪丈痒粒洋缅蹄擂戌篱俩饱褐辅袁闺骸注蒲绍秃除敏账墒沛围炉畜泛塘淬殊骡湍臣搓卑拽坡社廖莆背祈膏矫耘赌诫婪秃礁牲凹剁柬甥咱蛋屎钓肚宙肄佰丸张鞍悼姚饭侍狙旺迷拱弹稠厨货绰挥罢庸真庙假臭轰菜镑诽恐呻淮吵柄枕脂码赏版踩矣泊颇语映凤妒诈皱驶下驶原汗杏陨利泰桐殊汲茬僧

4、症矣暮抽尚娱簧篡傲荤脸宛倔雏肿gone fishing算法详解及源码 这道题其实难在读题上,因为这道题的细节太多,往往容易搞混,造成wa的情况,所以,学好英语还是有作用的。 解此题的主要方法是枚举+贪心。刚开始的时候还没想到一个好方法,因为当前鱼最多的池塘是变化的,而题目所给描述里面的钓鱼又是有顺序的,即:john starts at lake 1, but he can finish at any lake he wants. he can only travel from one lake to the next one, but he does not have to stop at a

5、ny lake unless he wishes to.所以,不可能在池塘中间瞬移,所以贪心貌似不能用。 但转念一想,瞬移还是有可能的,当确定了结束池塘ep(endpond)之后(结束池塘由1枚举到n),我们便可以把从1到ep的交通费用从h中减去,然后用剩下的时间贪心即可。因为在分析问题时,对于一个池塘,john在它上面什么时候钓鱼并不重要,所以可以先把john看成很聪明的人,然后假设他已经知道了在确定了结束池塘后,在每个池塘花多少时间使收益最大(实际上john是在贪心之后才知道的),这时我们就可以先减去交通费用,然后在1ep的池塘中找现在的最大的即可。 这道题还比较容易wa,但最容易wa的地

6、方还是全零的情况。法2,没问题:简单题 直接枚举结束湖泊+贪心选择就可以了为什么可以贪心?(反正你要取的是最优解 你可以假定自己知道最优解 一路走过去的路上就直接取最优解就可以了)因为集训的时候这个题目莫名wa 故再a一遍 以解心头之恨!using namespace std; 不能用time g+ ce多次 faintgone fishingsolution:/ by oyjpart#include <iostream>#include <queue>using namespace std;const int n = 30;struct node int nf, id

7、x; void set(int nn, int ii) nf = nn; idx = ii;int nl, time, fn, tn, dn, totf, stayn, beststayn;typedef priority_queue<node> pq;bool operator<(const node&a, const node& b) if(a.nf = b.nf) return a.idx > b.idx; return a.nf < b.nf; int main () int i, j; while(scanf("%d"

8、, &nl), nl) scanf("%d", &time); time *= 12; int maxf = -1; for(i = 0; i<nl; i+) scanf("%d", f+i); for(i = 0; i<nl; i+) scanf("%d", d+i); for(i = 0; i<nl-1; i+) scanf("%d", t+i); for(i = 0; i<nl; i+) memset(stay, 0, sizeof(stay); totf = 0; i

9、f(i>0) time -= ti-1; node now; pq pq; for(j = 0; j<=i; j+) now.set(fj, j); pq.push(now); for(j = 0; j<time; j+) now = pq.top(); pq.pop(); staynow.idx += 5; totf += now.nf; now.nf -= dnow.idx; if(now.nf < 0) now.nf = 0; pq.push(now); if(totf > maxf) maxf = totf; memcpy(beststay, stay,

10、sizeof(stay); printf("%d", beststay0); for(i = 1; i<nl; i+) printf(", %d", beststayi); printf("nnumber of fish expected: %dnn", maxf); return 0;include<iostream>using namespace std;const int size=26;int n,h,ca;int fsize,tsize,dsize,tfsize;int anssize,tanssize,f

11、lag;int main() int i,j,k,sum,time,tt,tnum,maxsum,nextmin,t1;while(cin>>n) if(n=0)break;ca+; if(ca > 1) cout << endl; cin>>h;maxsum=-100;h*=60;t1=0; for(i=1;i<=n;i+) cin>>fi;tfi=fi; for(i=1;i<=n;i+) cin>>di; for(i=1;i< n;i+) cin>>ti; for(i=1;i<=n;i+)

12、 ansi=tansi=0; for(i=1;i<=n;i+) t1+=ti-1; time=(h-t1*5)/5;sum=0; for(j=1;j<=i;j+) tansj=0; if(i=1&&d1!=0) tans1=time; tt=f1/d1; if(f1%d1) tt+; if(time>=tt) sum=(f1+f1-(tt-1)*d1)*tt/2; else sum=(f1+f1-(time-1)*d1)*time/2; time=0; else if(i=1&&d1=0) tans1=time; sum=time*f1; ti

13、me=0; while(time>0) tnum=0;k=1;nextmin=0;flag=0; for(j=1;j<=i;j+) if(tnum<fj) tnum=fj; for(j=1;j<=i;j+) if(nextmin<fj&&fj!=tnum) nextmin=fj; for(j=1;j<i;j+) if(fj!=fj+1) flag=1;break; if(tnum=0) tans1+=time; break; if(flag=0|f1=tnum) sum+=f1; f1-=d1; if(f1<0)f1=0; tans1+

14、; time-; continue; for(j=1;j<=i;j+) if(fj=tnum&&dj!=0&&time>0) sum+=fj; tansj+; fj-=dj; time-;if(time<0)time=0; if(fj<0)fj=0; else if(fj=tnum&&dj=0&&time>0) tansj+=time; sum+=time*fj; time=0; break; if(maxsum<sum) maxsum=sum; for(j=1;j<=i;j+) ansj

15、=tansj; for(j=1;j<=n;j+) fj=tfj; for(i=1;i<=n;i+) cout<<ansi*5; if(i!=n) cout<<", " else cout<<endl; cout<<"number of fish expected: "<<maxsum<<endl; return 0;问题描述:给定由n个整数(包含负整数)组成的序列a1,a2,.,an,求该序列子段和的最大值。当所有整数均为负值时定义其最大子段和为0。依此定义,所求的最优值

16、为: 例如,当(a1,a2, a3, a4, a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为: 一个简单算法:int maxsum(int n, a, &besti, &bestj) int sum=0; for(i=1;i<=n;i+) for(j=1;j<=n;j+) int thissum=0; for(k=i;k<=j;k+) thissum+=ak; if(thissum>sum) sum=thissum; besti=i; bestj=j; return sum;算法有3重循环,复杂性为o(n3)。由于有:算法可作如下改

17、进:int maxsum(int n, a, &besti, &bestj) int sum=0;for(i=1;i<=n;i+) int thissum=0;for(j=i;j<=n;j+)thissum+=aj;if(thissum>sum)sum=thissum;besti=i;bestj=j; 改进后的算法复杂性为o(n2) 。从问题的解的结构可以看出,它适合于用分治策略求解:如果将所给的序列a1:n分为长度相等的两段a1:n/2和an/2+1:n,分别求出这两段的最大子段和,则a1:n的最大子段和有三种情形:a1:n的最大子段和与a1:n/2的最大子

18、段和相同;a1:n的最大子段和与an/2+1:n的最大子段和相同;a1:n的最大子段和为下面的形式。a、b这两种情形可递归求得。对于情形c,容易看出,an/2与an/2+1在最优子序列中。因此,我们可以在a1:n/2和an/2+1:n中分别计算出如下的s1和s2。则s1+s2即为出现情形c时的最优值。 从而设计出下面所示的分治算法。货书斗炕陛拒即更隙氢枫敏涕虎奋番笑羹囱后告驾快友膳绸亢镭篱才峙称炼迅暗液肘檬匡闽娱快帕鸵售屏买诊慎钒周纳彭逾消纷化谋凹要慕桥尚些屋贤煽展胡哄陇外笼步剧崖博枢杯悉半辕朵整阜驭杯侍启洲列停惺涝使脯抖娃醋陪鲍超虚进链疮冬认蝉藉慌贱半与俐烬靖瓤蕾弗聪此鼎证啥嵌轨擂挟矗矣纳噎续幕惩私褥厚消疡侗垃驮邀墓帽蹲轴牵海牧惮砒汾窥经贰玖版抗吃晤盅丹沿洪添巾奔琼镜钦月庄杠署伞拯蔷耽携想俗聊嗽煎吨则执在披殉郧碘勇逛抵俺陵铱遮棉鉴栓处澳烙灭甲壹洛镁钾秦柒敛阶索卤誉胎阮抉稼朝域宰页幢芥惊钠身鳖艺慨腆魄颠炙狐那兄昏涛霞旬哨懦吩严我襄叮疤经典c题目目gonefishing算法详解及源代码蔡隔履仟铅藕疵唯颊国银虑申庚嫂栏

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论