PAT-甲级-1007

一、看题,https://www.patest.cn/contests/pat-a-practise/1007

  其实,也是一顿暴力,但是最后一个测试点会运行超时,最开始,计算一段区间的值的总和的时候,我用的下面一段代码:

1 int cal(int a,int b) {
2    int sum=0;
3    for(int i=a; i<=b; i++) sum+=s[i];
4    return sum;
5 }

  很遗憾,就是这段代码引发了超时,后来想到了在给数组赋值的时候作数组的前缀和,也就另开了一个和原数组一样大的数组,加了这么一行代码,用来计算前缀和:

1 b[k]=(k==0?s[k]:b[k-1]+s[k]);

  然后,就又是直接暴力就行,不过在进行区间总和计算的时候,直接访问数组就好了,来,看代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<time.h>
 6 #include<set>
 7 #include<deque>
 8 #include<stack>
 9 #include<cmath>
10 #include<string>
11 #include<cstdlib>
12 #include<stdio.h>
13 #include<string.h>
14 #include<stdlib.h>
15 #define inf 0x3f3f3f3f
16 typedef long long ll;
17 using namespace std;
18 int n;
19 int s[10001];
20 int b[10001];
21 bool allnegative(int pos) {
22     for(int i=0; i<pos; i++) if(s[i]>=0) return false;
23     return true;
24 }
25 int main(int argc, char const *argv[]) {
26     cin>>n;
27     for(int k=0; k<n; k++) {
28         cin>>s[k];
29         b[k]=(k==0?s[k]:b[k-1]+s[k]);
30     }
31     if(allnegative(n)) cout<<0<<" "<<s[0]<<" "<<s[n-1]<<endl;
32     else {
33         int left,right,mmax=-1;
34         for(int i=0; i<n; i++)
35             for(int j=i; j<n; j++)
36                 if(b[j]-b[i]+s[i]>mmax) {
37                     mmax=b[j]-b[i]+s[i];
38                     left=i;
39                     right=j;
40                 }
41         cout<<mmax<<" "<<s[left]<<" "<<s[right]<<endl;
42     }
43     return 0;
44 }

 

posted @ 2017-11-05 19:21  hesetone  阅读(443)  评论(0编辑  收藏  举报