hdu 1003,hdu 1231 最长连续和

来源:互联网 发布:网络监测平台 编辑:程序博客网 时间:2024/05/02 04:30
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003
#include <iostream>#include<fstream>#include<string>using namespace std;int main(){     //ifstream cin("testdata.txt");     int n=0;     cin>>n;     for(int l=0;l<n;l++)     {        int size=0;           cin>>size;         int *p=new int[size];          for(int i=0;i<size;i++)              cin>>p[i];         int begin=0;         int end=0;         int sum=0;         int maxsum=p[0];         int maxbegin=0;         int maxend=0;          for(int i=0;i<size;i++)            {               sum+=p[i];               if(sum>maxsum)                 {                    maxbegin=begin;                    maxend=i;                    maxsum=sum;                 }                if(sum<0)                {                   begin=i+1;                   sum=0;                 }             }          cout<<"Case "<<l+1<<":"<<endl;          cout<<maxsum<<" "<<maxbegin+1<<" "<<maxend+1<<endl;         if(l<n-1) cout<<endl;     }}

上面是很久以前做的了,hdu 1231 是同一个题: http://acm.hdu.edu.cn/showproblem.php?pid=1231

题目地址:

有一个新的思路,考察a[j] 作为结尾的最长连续和实际上是求s[i]  (i<=j-1) 的最小值,然后这个最小值是“当前最小值”,可以直接把当前要考虑的数和之前找到的最小数进行比较

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int sum[10005];int a[10005];int start[10005];int main(){   int n;   while(cin>>n)   {     if(n==0)  break;     memset(sum,0,sizeof(sum));     memset(start,0,sizeof(start));     int temp;      for(int i=0;i<n;i++)      {         scanf("%d",&a[i+1]);         sum[i+1]=sum[i]+a[i+1];      }    int curmin=2147483647;    int minindex=0;      for(int i=1;i<=n;i++)      {         if(sum[i-1]<curmin)          {             curmin=sum[i-1];             minindex=i-1;             start[i]=minindex;          }          else          {             start[i]=minindex;          }      }          int begin=0;          int end=0;          int max=-2147483647;          for(int i=1;i<=n;i++)          {              if(sum[i]-sum[start[i]]>max)              {                  max=sum[i]-sum[start[i]];                  begin=start[i];                  end =i;              }          }        if(max>=0)         cout<<max<<" "<<a[begin+1]<<" "<<a[end]<<endl;        else        cout<<0<<" "<<a[1]<<" "<<a[n]<<endl;   }}


原创粉丝点击