今日頭條2018校園招聘第一題 ---POJ 2479
阿新 • • 發佈:2019-02-18
第一次參加公司的招聘筆試,雖然只是抱著試試水的心態去參加的,可惜的是第一題就做錯了。。。。。
第一題,其實只是一個求最大子段和的變式題,不過筆試的時候也不知道怎麼了,就是不知道思路,最後還寫了一個錯的思路
題目大意:筆試題是求兩個不相鄰區間的最大子段和, OJ題是不相交區間的最大子段和
思路:很簡單,遍歷一遍,記錄從前往後每個元素以該元素結尾的最大子段和,從後往前每個元素以該元素結尾的最大欄位和, 然後一層遍歷列舉每一個斷點,求出該斷點前的最大子段和和斷點後的最大子段和最大值
Maximum sum
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.
Print exactly one line for each test case. The line should contain the integer d(A).
Huge input,scanf is recommended. Maximum sum
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.
Huge input,scanf is recommended.
思路:很簡單,遍歷一遍,記錄從前往後每個元素以該元素結尾的最大子段和,從後往前每個元素以該元素結尾的最大欄位和, 然後一層遍歷列舉每一個斷點,求出該斷點前的最大子段和和斷點後的最大子段和最大值
Maximum sum
Time Limit: 1000MS | Memory Limit: 65536K |
Total Submissions: 41980 | Accepted: 13098 |
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
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
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. Maximum sum
Time Limit: 1000MS | Memory Limit: |
Total Submissions: 41980 | Accepted: 13098 |
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<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<sstream>
#include<cctype>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI=acos(-1.0);
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const int maxn=1234;
int T;
int a[50005];
int b1[50005],b2[50005];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int sum=0;
int maxs=a[0];
for(int i=0;i<n;i++)、、從前往後的最大子段和
{
sum+=a[i];
if(sum>maxs) maxs=sum;
if(sum<0) sum=0;
b1[i]=maxs;
}
sum=0;
maxs=a[n-1];
for(int i=n-1;i>=0;i--){//從後往前的最大子段和
sum+=a[i];
if(sum>maxs) maxs=sum;
if(sum<0) sum=0;
b2[i]=maxs;
}
int ans=b1[0]+b2[1];
for(int i=0;i<n-1;i++)
{
ans=max(ans,b1[i]+b2[i+1]);
}
printf("%d\n",ans);
}
return 0;
}