• hdu 1003,hdu 1231 最长连续和


    题目地址: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;
    
    
       }
    }
    


  • 相关阅读:
    mysql 行号
    java 异常链
    springsecurity密码加密
    java 四舍五入
    ArrayList的使用及原理
    java 匿名内部类
    java 克隆
    logback的配置
    信号量 Semaphore
    障碍器 CyclicBarrier
  • 原文地址:https://www.cnblogs.com/814jingqi/p/3310439.html
Copyright © 2020-2023  润新知