poj2479,poj 2593 动归

31 篇文章 0 订阅

 

   poj 2479

     如题:http://poj.org/problem?id=2479

     题目很简单 就不翻译了 大概说是求一个数组中2段最大的和

 

    这个题目数据量是50000,但时间只有1000ms

    在输入的同时 将之前可能出现的最大连续求出,保存在另一个数组,然后在从后向前遍历一次,求出从后向前连续可能出现最大和,后向前遍历的同时,和前面求出数组中的和相加,匹配,寻找最终的结果。

   注意两点:1.输入数 组中每个数据时用scanf 不然可能超时 

                     2.ans初始化要为MIN

#include<iostream>
using namespace std;
#define MIN -999999999
int num[50001];
int count[50001];

int main()
{
 int ans;
 int N;
 cin>>N;
 int max,sum,n,i;
 while(N--)
 {
 ans=MIN;
 max=MIN;
 sum=0;
  cin>>n;
  for(i=1;i<=n;i++)
  {
   scanf("%d",&num[i]);
   sum+=num[i];
   if(sum>max)
    max=sum;
   count[i]=max;
   if(sum<0)
    sum=0;
  }
  max=MIN;
  sum=0;
  for(i=n;i>1;i--)
  {
   sum+=num[i];
   if(sum>max)
    max=sum;
   if(ans<max+count[i-1])
    ans=max+count[i-1];
   if(sum<0)
    sum=0;
  }
  cout<<ans<<endl;
 }
 return 0;
}

 

poj 2593

     http://poj.org/problem?id=2593

  题目和2479一样 只是时间要求相对宽松

          

#include<iostream>
using namespace std;
#define MIN -999999999
#define MAXN 100002

int num[MAXN];
int count[MAXN];


int main()
{
 int N,i,sum,max,ans;
 while(1)
 {
  sum=0;
  max=MIN;
 cin>>N;
 if(N==0) break;
 for(i=1;i<=N;i++)
 {
  scanf("%d",&num[i]);
  sum+=num[i];
  if(sum>max)
   max=sum;
  count[i]=max;
  if(sum<0)
   sum=0;
 }
 max=MIN;
 sum=0;
 ans=MIN;
 for(i=N;i>1;i--)
 {
  sum+=num[i];
  if(sum>max)
   max=sum;
  if(ans<max+count[i-1])
   ans=max+count[i-1];
  if(sum<0)
   sum=0;
 }
 cout<<ans<<endl;
 }
 return 0;
}

 

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值