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
得到的结果完全不同