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
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include<set>
 7 #include
 8 #include
 9 #include
10 #include<string>
11 #include
12 #include
13 #include<string.h>
14 #include
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; iif(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) {
28         cin>>s[k];
29         b[k]=(k==0?s[k]:b[k-1]+s[k]);
30     }
31     if(allnegative(n)) cout<<0<<" "<0]<<" "<1]<<endl;
32     else {
33         int left,right,mmax=-1;
34         for(int i=0; i)
35             for(int j=i; 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<" "<" "<endl;
42     }
43     return 0;
44 }

 

你可能感兴趣的:(PAT-甲级-1007)