简述:这是一道很简单的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;
}
(题目及代码如下)
话说老王非常喜欢钓鱼,今天他又要去钓鱼了。延着公路有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;
}