Feel Good
题面


题意
从一堆数中找到连续的一串数,假设有k个数,那么这一串数所代表的值就是这k个数的和乘上这个数中的最小值,所得的值记作maxn,问maxn最大是多少。

分析
这题可以首先记录一下前i个数的和(i属于1-n),然后记录这n个数中每一个数作为最小值可以得到的最大值。然后搜索这n个数中的最大值并输出要求值。注意这道题如果用cin cout会出现tle而使用scanf和printf就可以通过了。

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
typedef struct{
	int left;
	int right;
	int val;
}P;
ll a[maxn],ma=-1,l,r;
P p[maxn];
int n,j;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&p[i].val);
		a[i]=a[i-1]+p[i].val;
	}///a[i]储存的是前i项的和
	for(int i=1;i<=n;i++){
		j=i-1;
		while(1){
			if(p[i].val>p[j].val||j<=0){
				p[i].left=j+1;
	                        break;
			}
			else{
				j=p[j].left-1;
			}
		}
	}
	for(int i=n;i>=1;i--){
		j=i+1;
		while(1){
			if(p[i].val>p[j].val||j>=n+1){
				p[i].right=j-1;
	                        break;
			}
			else{
				j=p[j].right+1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		ll cn=p[i].val*(a[p[i].right]-a[p[i].left-1]);
		if(cn>ma){
			ma=cn;
			l=p[i].left;
			r=p[i].right;
		}
	}
	printf("%lld\n",ma);
	printf("%lld %lld\n",l,r);
    return 0;
}