http://acm.fzu.edu.cn/problem.php?pid=2168

题目大意:

给定n个数和m,要求从n个数中选择连续的m个,使得a[i]*1+a[i+1]*2+……a[i+m]*m最大

思路:

常规思路是以每个数开始,枚举m个,但是这样会TLE。

可以有O(n)的算法。

例如样例的

n=5 m=3

五个数分别为

2 1 3 1 4

有三种连续的三个数

2 * 1 + 1 * 2 + 3* 3 = 13

1 * 1 + 3 * 2 + 1 * 3= 10

3 * 1 + 1 * 2 + 4 * 3 = 17

设sum[i]为到i的m个数的和,dp[i]为以i结束的m个数的乘积值。

则相邻两组间有关系,dp[i] =dp[i-1]-sum[i-1] + m*a[i] ;

例如   第第二组的那个 dp[4 ]= dp[3]- sum[3] + 3 * 1 = 13-6+3*1=10

#include<cstdio>
const int MAXN=1000000+10;
int sum[MAXN],dp[MAXN],a[MAXN];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
sum[0]=0;
dp[m]=0;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]); for(int i=1;i<=m;i++)
{
sum[i]=sum[i-1]+a[i];
dp[m]+=a[i]*i;
}
int ans=dp[m];
for(int i=m+1;i<=n;i++)
{
dp[i]=dp[i-1]-sum[i-1];
dp[i]=dp[i]+m*a[i];
sum[i]=sum[i-1]+a[i]-a[i-m]; if(ans<dp[i])
ans=dp[i];
}
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. 30秒懂SQL中的join(2幅图+30秒)
  2. 区别 Jquery对象和Dom对象
  3. codeforces 495A. Digital Counter 解题报告
  4. sql server 数据库模型 备份 恢复 总结 备份脚本
  5. zend studio常见问题解答
  6. 【转】WPF颜色相关操作
  7. ArcGIS 10.2与CityEngine2013共存的安装
  8. opencv Iplimage结构简介
  9. 瑞柏匡丞谈中国移动app的国际进阶路
  10. PHP数组与对象之间用递归转换
  11. 在Windows下搭建React Native Android开发环境
  12. NYOJ--1236--挑战密室(第八届河南省程序设计大赛)
  13. WordPress二级菜单设置
  14. 面试01:解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
  15. 第一讲(3)osgearth编译
  16. P2871 手链
  17. java基础-day19
  18. springboot(五):springboot整合shiro-登录认证和权限管理
  19. 如何设置maven的local repository目录
  20. Internet History, Technology and Security (Week 2)

热门文章

  1. Cocos2d-x开发的Android应用怎么加入插屏广告
  2. GO语言为结构体排序
  3. HTTP请求和响应1:概述
  4. servlet学习(1)
  5. 动态游标(比如表名作为參数)以及动态SQL分析
  6. worldpress 的 GPG 加密插件
  7. Impala性能优化
  8. 51Nod 圆与三角形
  9. springboot扫描通用的依赖模块
  10. php中this,self,parent三个关键字的区别辨析