博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Feel Good
阅读量:5117 次
发布时间:2019-06-13

本文共 1451 字,大约阅读时间需要 4 分钟。

poj2796:

题意:给出一个长度为n(n<100000)的序列,求出一个子序列,使得这个序列中的最小值乘以这个序列的和的值最大。

思路:枚举每一个点,然后算出以这个点为最小值的区间能向左向右扩展到哪里,然后选择最优的就行。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 const int N=1e5+10; 7 long long a[N]; 8 long long ll[N],rr[N]; 9 long long sum[N];10 int n;11 int main(){12 while(~scanf("%d",&n)){13 memset(sum,0,sizeof(sum));14 memset(ll,0,sizeof(ll));15 memset(rr,0,sizeof(rr));16 memset(a,-1,sizeof(a));17 sum[0]=0;18 for(int i=1;i<=n;i++){19 scanf("%I64d",&a[i]);20 sum[i]=sum[i-1]+a[i];21 }22 for(int i=1;i<=n;i++){23 ll[i]=i;24 if(i==1)continue;25 long long t=i-1;26 while(a[i]<=a[t]){27 ll[i]=ll[t];28 t=ll[t]-1;29 }30 }31 for(int i=n;i>=1;i--){32 rr[i]=i;33 if(i==n)continue;34 long long t=i+1;35 while(a[i]<=a[t]){36 rr[i]=rr[t];37 t=rr[t]+1;38 }39 }40 long long l,r,ans=-1;41 for(int i=1;i<=n;i++){42 long long temp=a[i]*(sum[rr[i]]-sum[ll[i]-1]);43 if(temp>ans){44 ans=temp;45 l=ll[i];r=rr[i];46 }47 }48 printf("%I64d\n%I64d %I64d\n",ans,l,r);49 }50 }
View Code

 

转载于:https://www.cnblogs.com/chujian123/p/3896895.html

你可能感兴趣的文章
安装 ant
查看>>
344. Reverse String
查看>>
Windows及其他软件开发过程中一般都有哪些版本?
查看>>
strlen、strcpy、strcat的实现
查看>>
UIBezierPath
查看>>
查询Ubuntu版本号
查看>>
Devexpress中WebChartControl控件柱状统计图的做法(数据为调用存储过程)
查看>>
devexpress中如何给TabPage控件的Tab定义背景色
查看>>
linux如何复制文件夹和移动文件夹
查看>>
WAMP环境搭建(windows+apache2.4+mysql5.7+php7)
查看>>
测试Markdown
查看>>
poj 1113 Wall
查看>>
tcp三次握手
查看>>
IntelliJ IDEA 代码字体大小的快捷键设置放大缩小(很实用)(图文详解)
查看>>
HTTP之gRPC
查看>>
Entity Framework 学习 DataBase First
查看>>
面向对象建模方法与数据库建模方法的比较
查看>>
library cache lock and user password
查看>>
面试题7-用两个栈实现队列
查看>>
Shell参数选项解析
查看>>