标签:题目 sample 价值 链接 pac ble result amp online
时间限制: 1 秒 内存限制: 128 MB | 提交: 728 解决: 99
题目链接:http://172.18.66.54:50015/JudgeOnline/problem.php?id=1282
6
-2 11 -4 13 5 -2
25
思路: 环装最大连续字段和
<1> 正环最大连续字段和 <2> 反环最大连续字段和 比较去最大
#include<cstdio> #define maxn 50000+100 typedef long long LL ; LL num[maxn] ; int n ; LL sum , result ; LL maxnum(LL *a){ LL k = 0 , ans1=0 ; for(int i=0 ; i<n ; i++){ if(k<0) k=0 ; k+=num[i] ; if(k>ans1) ans1 = k ; } return ans1 ; } int main(){ while(~scanf("%d" , &n)) { for(int i=0 ; i<n ; i++){ scanf("%lld" , &num[i]) ; sum+=num[i] ; } LL flag = maxnum(num) ; for(int i=0 ; i<n ; i++) num[i] = -num[i] ; LL flag2 = maxnum(num) ; result = flag>flag2+sum?flag:flag2+sum ; // 求出的反环最大连续子段和 在原环中是最小的负数或者0 printf("%lld\n" , result) ; } return 0 ; } /************************************************************** Problem: 1282 User: 201616040106 Language: C++ Result: 正确 Time:16 ms Memory:1480 kb ****************************************************************/
/*同时求最大连续子段和 与 最小连续子段和 */
#include<stdio.h> #include<algorithm> using namespace std; int main() { int n; while(~scanf("%d",&n)) { long long summax=0; long long summin=0; long long summx=0,summn=0,sum=0; int num[50005]; for(int i=0;i<n;i++) { scanf("%d",&num[i]); sum+=num[i]; } for(int i = 0 ; i < n ; i++) { summx+=num[i]; summn+=num[i]; summax=max(summax,summx); summin=min(summin,summn); if(summx<0) summx=0; if(summn>0) summn=0; } printf("%lld\n",max(summax,sum-summin));// 求出的最小值 是负数或者 0 } return 0; } /************************************************************** Problem: 1282 User: 52lemon Language: C++ Result: 正确 Time:8 ms Memory:1168 kb ****************************************************************/
标签:题目 sample 价值 链接 pac ble result amp online
原文地址:http://www.cnblogs.com/yi-ye-zhi-qiu/p/7635867.html