1. 程式人生 > 實用技巧 >Educational Codeforces Round 88 (Rated for Div. 2) D、Yet Another Yet Another Task

Educational Codeforces Round 88 (Rated for Div. 2) D、Yet Another Yet Another Task

題意:

給你一個含n個數a1,a2...an的陣列,你要找到一個區間[l,r],使得al+a(l+1)+...+a(r-1)+ar減去max(al,a(l+1),...,a(r-1),ar)的值儘可能大

n<=1e5

-30<=ai<=30

題解:

因為ai的範圍特別小,我們可以列舉區間[l,r]的最大值,然後就是暴力迴圈(這一點看程式碼)

程式碼:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include
<deque> #include<string.h> #include<map> #include <iostream> #include <math.h> #define Mem(a,b) memset(a,b,sizeof(a)) const double II = acos(-1); const double PP = (II*1.0)/(180.00); using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; const int maxn=2e5+10; const
double eps=1e-6; const double PI=acos(-1); int v[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> v[i]; } int sum = 0; int ans = 0; for (int i = 0; i <= 30; i++) //ö�����������ֵ
{ sum = 0; for (int j = 1; j <= n; j++) { if( v[j] > i ) sum = 0; else { sum += v[j]; if( sum < 0 ) sum = 0; ans = max(ans,sum-i); //�������� } } } cout << ans << '\n'; return 0; }