poj2479 Maximum sum
2015-12-09 23:57
253 查看
Maximum sum
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 37096 Accepted: 11570
Description
Given a set of n integers: A={a1, a2,…, an}, we define a function d(A) as below:
Your task is to calculate d(A).
Input
The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, …, an. (|ai| <= 10000).There is an empty line after each case.
Output
Print exactly one line for each test case. The line should contain the integer d(A).
Sample Input
1
10
1 -1 2 2 3 -3 4 -4 5 -5
Sample Output
13
Hint
In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.
Huge input,scanf is recommended.
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 37096 Accepted: 11570
Description
Given a set of n integers: A={a1, a2,…, an}, we define a function d(A) as below:
Your task is to calculate d(A).
Input
The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, …, an. (|ai| <= 10000).There is an empty line after each case.
Output
Print exactly one line for each test case. The line should contain the integer d(A).
Sample Input
1
10
1 -1 2 2 3 -3 4 -4 5 -5
Sample Output
13
Hint
In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.
Huge input,scanf is recommended.
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; /*代码一:TLE int main() { int a[50001]; int left[50001]; int right[50001]; int T; int n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); //left[i]表示i(包括i)左边最大字段和 left[0]=a[0]; for(int i=1;i<n;i++) { if(left[i-1]<0) left[i]=a[i]; else left[i]=left[i-1]+a[i]; } //right[i]表示i(包括i)右边最大字段和 right[n-1]=a[n-1]; for(int i=n-2;i>=0;i--) { if(right[i+1]<0) right[i]=a[i]; else right[i]=right[i+1]+a[i]; } int temp=-10000; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) if(temp<(left[i]+right[j])) temp=left[i]+right[j]; } for(int i=0;i<n;i++) if(temp<(left[i]+right[i+1])) temp=left[i]+right[i+1]; printf("%d",temp); } return 0; } */ //只接受O(N)的算法 int main() { int a[50001]; int left[50001]; int right[50001]; int T; int n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); //left[i]表示i(包括i)左边最大字段和 left[0]=a[0]; for(int i=1;i<n;i++) { if(left[i-1]<0) left[i]=a[i]; else left[i]=left[i-1]+a[i]; } //left[i]表示i左边的最大字段和 for(int i=1;i<n;i++) { left[i]=max(left[i],left[i-1]); } //right[i]表示i(包括i)左边最大字段和 right[n-1]=a[n-1]; for(int i=n-2;i>=0;i--) { if(right[i+1]<0) right[i]=a[i]; else right[i]=right[i+1]+a[i]; } //right[i]表示i 右边最大字段和 for(int i=n-2;i>=0;i--) right[i]=max(right[i],right[i+1]) ; int temp=-10000; for(int i=0;i<n-1;i++) if(temp<(left[i]+right[i+1])) temp=left[i]+right[i+1]; printf("%d\n",temp); } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- POJ 1088 滑雪
- poj2387 Til the Cows Come Home—Dijkstra模板