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

  简述:这是一道很简单的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值