日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B.寻找最大值

發布時間:2025/4/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的B.寻找最大值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。