一道简单的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;
}
]”运算符时必须考虑访问越界问题,否则可能会导致程序崩溃,而对于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;
}
相关文章推荐
- 巧用CPU缓存优化代码:数组 vs. 链表
- 巧用CPU缓存优化代码: 数组VS链表
- 为博客园上一道面试题写的代码-一道求单向链表倒数第N个结点的算法题。
- 【转】巧用CPU缓存优化代码:数组 vs. 链表
- 巧用CPU缓存优化代码:数组 vs. 链表(转)
- 数据结构之链表与数组(三)-单向链表上的简单操作
- 巧用CPU缓存优化代码:数组 vs. 链表(转)
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- C++中数组、链表和vector等容器之间的区别
- C++中数组、链表和vector等容器之间的区别
- 一道简单的递推题(快速幂+矩阵乘法优化+滚动数组)
- LintCode【简单】6. 合并排序数组 II,9. Fizz Buzz 问题。代码及思路 ——【vector用法】
- [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
- [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
- 数据结构之链表与数组(二) -单向链表上的简单操作问题
- [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
- STL容器(vector,list)--数组和链表的区别
- 数组简单实现单向链表
- 数据结构之链表与数组(三)-单向链表上的简单操作
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)