B.寻找最大值
算法:
1.正向思維如果枚舉區間求最值肯定TLE,數據量很大。
2.反向思維,枚舉每個點的左右區間,雖然兩個for循環,我感覺是平均是O(N)的時間復雜度,動態規劃的思想,可以求出。
3.這題相當詭異,不能給dt數組清空賦值,坑了我一晚上加上午,還不知道為什么。
4.我的L[I]記錄的是該點能往左到達的邊界,R【i]是往右到達的邊界。旭他們記錄的是以該點向左能擴張的長度,R【i]類似。
View Code #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; const long long inf = -(1LL<<60); int N; long long dt[201000]; //輸入數據 long long sum[201000]; //靜態,不需要修改,數組維護最長前綴和 long long L[201000]; long long R[201000];int main( ) {while( scanf("%d",&N) != EOF){memset(sum, 0, sizeof(sum));for(int i = 1; i <= N; i++){ scanf("%I64d",&dt[i]);sum[i] = sum[i-1] + dt[i];}memset(L,0,sizeof(L));memset(R,0,sizeof(R));for(int i = 1; i <= N; i++){ int j = i-1, len = 0;while(j >= 1){if( dt[i] > dt[j] ) break;else{len += 1+L[j];j = j-L[j]-1; } }L[i] = len;}for(int i = N; i >= 1; i--){ int j = i+1, len = 0;while(j <= N ){if( dt[i] > dt[j] ) break;else{len += 1+R[j];j = j+R[j]+1; } }R[i] = len;}long long maxn = inf;long long ans;for( int i = 1; i <= N; i++){int l = i-L[i];int r = i+R[i];ans = (sum[r] - sum[l - 1]) * dt[i];if( ans > maxn )maxn = ans;}printf("%I64d\n",maxn); }return 0; }?
View Code #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; const long long inf = (1LL<<60); int N; long long dt[301000]; //輸入數據 long long sum[301000]; //靜態,不需要修改,數組維護最長前綴和 int L[301000]; int R[301000];int main( ) { while( scanf("%d",&N) != EOF){ for(int i = 1; i <= N; i++){ scanf("%I64d",&dt[i]);sum[i] = sum[i-1] + dt[i];}memset(L,0,sizeof(L));memset(R,0,sizeof(R));for(int i = 1; i <= N; i++){ if( dt[i] == dt[i-1] && i != 1){L[i] = L[i-1];continue; }if( dt[i] > dt[i-1] || i == 1){L[i] = i; }else{ int j = i;while( --j ){ int x = L[j];if( dt[x - 1] < dt[i] ){L[i] = x; break; } }} }for( int i = N; i >= 1; i--){ if( dt[i] == dt[i+1] && i != N){R[i] = R[i+1];continue; } if( dt[i] > dt[i+1] || i == N){R[i] = i; }else{ int j = i;while( ++j <= N ){ int x = R[j];if( dt[x + 1] < dt[i] ){R[i] = x; break; } }} }long long maxn = -inf;for( int i = 1; i <= N; i++){long long ans = (sum[R[i]] - sum[L[i] - 1]) * dt[i];if( ans > maxn )maxn = ans;}printf("%I64d\n",maxn);}return 0; }轉載于:https://www.cnblogs.com/tangcong/archive/2012/08/18/2645085.html
總結
- 上一篇: [Java]Object有哪些公用方法?
- 下一篇: element隐藏组件滚动条scroll