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 }