FZU Problem 2168 防守阵地 I
来源:互联网 发布:gt designer3数据版本 编辑:程序博客网 时间:2024/05/30 02:22
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 0
- FZU Problem 2168 防守阵地 I
- FZU Problem 2168 防守阵地 I
- FZU 2168 防守阵地 I
- FZU 2168 防守阵地 I
- 防守阵地 I FZU - 2168
- 福州大学 Problem 2168 防守阵地 I
- FZU 2168 防守阵地 I(公式推导)(经典)(中等)
- FZU 2168 防守阵地I (模拟 简单规律)
- FZU_Problem 2168 防守阵地 I
- fzu 防守阵地 1
- 2168 防守阵地 I(简单数学题)
- FZU2169:防守阵地 I
- 防守阵地 I
- FZU2168 防守阵地 I
- FZU2168 防守阵地 I
- FZU_2168_防守阵地I
- FZU2168:防守阵地 I
- 防守阵地 I
- linux运维
- myeclipse中部署jsp项目
- C++学习笔记29,引用变量(1)
- dll和so文件区别与构成
- js实现键盘操作对div的移动或改变-------Day43
- FZU Problem 2168 防守阵地 I
- 在web端和android端通过JSON格式实现数据交互
- 【转】TCP的SACK选项功能的详细解读
- linux 动态装载动态库 ldd,ldconfig,ld.so.conf, ld.so.cache
- wangzhan
- FLex中RegExp正则表达式
- JAVA 序列号 反序列化
- ZOJ-1457
- VS2010 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 的解决方法