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; }