poj2497(买一送一poj2593)

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int left[100005];
 5     int right[100005];
 6     int a[100005];
 7     int Case;
 8     scanf("%d",&Case);
 9     while(Case--)
10     {
11         int n,i;
12         scanf("%d",&n);
13         if(n==0) break;
14         for(i=0;i<n;i++)
15         {
16             scanf("%d",&a[i]);
17         }
18         int sumL=0;
19         int max=-99999999;
20         for(i=0;i<n;i++)//从左向右求到i结尾的最大连续子串的最大值
21         {
22             sumL=sumL+a[i];
23             if(sumL>max)
24             {
25                 max=sumL;
26             }
27             if(sumL<0)
28             {
29                 sumL=0;
30             }
31             left[i]=max;
32         }
33         max=-99999999;
34         int tmp=-99999999;
35         int sumR=0;
36         for(i=n-1;i>=1;i--)
37         {
38             sumR=sumR+a[i];
39             if(sumR>max)
40             {
41                 max=sumR;
42             }
43             if(sumR<0)
44             {
45                 sumR=0;
46             }
47             if(tmp<max+left[i-1])
48             {
49                 tmp=max+left[i-1];
50             }
51         }
52         printf("%d\n",tmp);
53     }
54     return 0;
55 }

 

看到一非常短小精悍的代码,分享下,不过不太看得懂,阅读别人的代码确实不易啊

 1 #include<cstdio>
 2 
 3 int max(int x, int y ) {return x>y? x : y; }
 4 
 5 int main()
 6 {
 7     int cas,n; 
 8     scanf("%d",&cas);
 9     while ( cas -- )
10     {
11         scanf("%d",&n);
12         int a, b , ans, a_max,k; 
13         a = b = a_max = 0;
14         ans = -99999999;
15         scanf("%d",&k);
16         b = a_max = k; 
17         a = max(k , 0 );
18         for (int i = 1; i<n; i++)
19         {
20             scanf("%d",&k);
21             a = a + k; 
22             if ( a < 0 ) a = 0; 
23             b = max( b+k , a_max+k );
24             ans = max( ans , b);
25             a_max = max( a, a_max);
26             b = max( b , a_max);
27         }
28         printf("%d\n",ans);
29     }
30 }

另外再说下,这道题对全是负数不做检查,上面的两个代码均可AC,但是对同一组数据,

1

5

-1 -1 -1 -1 -1 

得到的结果完全不同

posted on 2012-08-07 09:42  矮人狙击手!  阅读(264)  评论(0编辑  收藏  举报

导航