您的位置:首页 > 编程语言

一道简单的acm题的三种解决方案(数组、单向链表、容器vector)与代码优化

2011-11-19 21:36 387 查看
简述:这是一道很简单的acm题,乍眼一看就想到用数组实现(fishing.cpp),的确数组实现毫无鸭梨28行代码搞定,但是数组不能动态分配内存,这会导致严重的内存浪费,于是想到单向链表(fishing1.cpp)。使用单向链表能动态分配内存并且便于随机访问,但是新的问题出现了——代码过于冗杂足足用了59行代码,并且程序可复用性较差。然后就是容器vector(fishing2.cpp),如果把做这一题看做杀鸡,那么数组是铅笔刀,单向链表是水果刀,容器vector就是杀猪刀,至于牛刀……目前水平有限还没发现。vector的优点在于能动态分配内存,便于内存管理,有较好的可重用性、安全性,而且代码简练只要27行,比如此题中设置数组长度为50时,仅数据来看fishing.cpp占用300*4=1200Byte,fishing2.cpp占用50*4=200Byte,对于内存如金的计算机来说这是巨大的浪费。而且在安全性上数组使用“[
]”运算符时必须考虑访问越界问题,否则可能会导致程序崩溃,而对于vector可以放心的使用函数at( ),而不用担心越界,这是因为他有“背背佳”,自动检查保证不会越界。当然对于容器还可以选择list、deque,他们三个各有千秋。不过我觉得对于这类需要随机存取的数据结构,用vector是最好的。这是本人自己的看法还望牛人们多多提出意见及建议。

(题目及代码如下)

话说老王非常喜欢钓鱼,今天他又要去钓鱼了。延着公路有N个湖,他可以在任何一个湖里钓鱼。由于他经常在这一地区调鱼,所以他基本上知道每次能在每个湖里钓到的鱼的数量W。后来他发现一个有趣的规律,那就是他如果在这个区域里延着公路连续的C个湖里(如从i到j)钓鱼的话,他钓到的鱼的总数量符合如下公式:C2+∑Wk(i<=K<=j)。老王想在M个湖里钓到最大数量的鱼,但是有太多的湖了,他很难计算出来。所以请写一个程序帮助老王计算出他所希望钓到鱼的数量。

输入:

测试例子中,第一行给出两个数据N和M(0<=M<=N<=300)。第二行有N个正整数,每个正整数代表在第i个湖里所能钓到的鱼的数量Wi。

输出:

对于每一个测试例子,请输出一行数据,表示老王所能钓到的鱼的最大数量。

例如输入:

8 5

4 5 2 13 7 1 1 11

对应输出:

58

提示:(13+7+1+1+11)+5*5=58

//fishing.cpp

#include<iostream>

using namespace std;

int main()

{ int lakenum,index,temp;

int lake[300]={0};

int sum[300]={0};

cin>>lakenum>>index;

if(lakenum>=0&&index>=0&&lakenum<=300&&index<=300)

{

for(int i=0;i<lakenum;i++)//输入每个湖的鱼量

cin>>lake[i];

for(int i=0;i<(lakenum-index+1);i++)//计算fish number

for(int j=i;j<(i+index);j++)

sum[i]+=lake[j];

for(int i=0;i<300-1;i++)//择优

for(int j=0;j<300-1-i;j++)

if(sum[j]>sum[j+1])

{

temp=sum[j];

sum[j]=sum[j+1];

sum[j+1]=temp;

}

cout<<sum[299]<<endl;

}

return 0;

}

//fishing1.cpp优化问题仍未解决

#include<iostream>

using namespace std;

struct lake

{

int lakenum;

int fish;

lake *next;

};

lake *create(int lakenum);

int sum(lake *head,int index);

int main()

{

lake *p;

int lakenum,index;

cin>>lakenum>>index;

p=create(lakenum);

cout<<sum(p,index)<<endl;

return 0;

}ss

lake *create(int lakenum)

{

lake *p1,*p2,*head;

int num=0;

head=NULL;

while(num<lakenum)

{

p1=new lake;

p2=p1;

cin>>p1->fish;

p1->lakenum=num;

if(head==NULL)

head=p1;

else

p2->next=p1;

p2=p1;

num++;

}

p2->next=NULL;

delete p1;

return head;

}

int sum(lake *head,int index)

{

lake *p;

int sum=0;

p=head;

while(p->next!=NULL)

{

if(p->lakenum==(index-1))

{

sum+=p->fish;

p=p->next;

}

else

p=p->next;

}

return sum;

}

//fishing2.cpp

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

int main()

{

vector<int> lake;

vector<int> fishsum;

int lakenum,fish;

int index=0;

int sum=0;

cin>>lakenum>>index;

for(int i=0;i<lakenum;i++)

{

cin>>fish;

lake.push_back(fish);

}

for(int i=0;i<lake.size();i++)//计算fish number

{ for(int j=i;j<(i+index);j++)

sum+=lake[j];

fishsum.push_back(sum);

sum=0;

}

sort(fishsum.begin(),fishsum.end());//择优

cout<<fishsum.at(fishsum.size()-1)<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: