Problem 2168 防守阵地 I

Accept: 377    Submit: 1280

Time Limit: 3000 mSec    Memory Limit : 32768 KB

 Problem Description

部队中共同拥有N个士兵,每一个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个须要防守的地点,按重要程度从低到高排序,依次以数字1到M标注每一个地点的重要程度,指挥部将选择M个士兵依次进入指定地点进行防守任务。能力指数为X的士兵防守重要程度为Y的地点将得到X*Y的參考指数。如今士兵们排成一排。请你选择出连续的M个士兵依次參加防守,使得总的參考指数值最大。

 Input

输入包括多组数据。

输入第一行有两个整数N,M(1<=N<=1000000。1<=M<=1000),第二行N个整数表示每一个士兵相应的能力指数Xi(1<=Xi<=1000)。

对于30%的数据1<=M<=N<=1000。

 Output

输出一个整数,为最大的參考指数总和。

 Sample Input

5 32 1 3 1 4

 Sample Output

17

思路:

这题肯定是不能暴力求解的,听说能够用什么线段树,我没试过。以下说说代码最少最快的公式推导:

例:

5 3 

2 1 3 1 4

5个数。如果用a,b,c,d,e表示这5个数。有两个数组,sum[]。s[](sum[i]表示前i 个数的和,s[i]表示前i 个sum[]的和)。

如今求1*a+2*b+3*c+4*d+5*e的和:

=a+b+c+d+e     sum[5]

+b+c+d+e         sum[5]-sum[1]

+c+d+e             sum[5]-sum[2]

+d+e                 sum[5]-sum[3]

+e                     sum[5]-sum[4]

即:

1*a+2*b+3*c+4*d+5*e=5*sum[5]-(sum[1]+sum[2]+sum[3]+sum[4])。

如今题目求连续三个数*1*2*3的最大和。接着看:

当i=3:

3*sum[3]=3*(a+b+c)

1*a+2*b+3*c=3*sum[3]-(2*a+b)=3*sum[3]-(a+b+a)=3*sum[3]-(sum[2]+sum[1])=3*sum[3]-(s[2]);

i=4:

3*sum[4]=3(a+b+c+d)

b+2*c+3*d=3*sum[4]-(3*a+2*b+c)=3*sum[4]-(sum[1]+sum[2]+sum[3])=3*sum[4]-(s[3])

这时候假设觉得公式就是:

m*sum[i]-s[i-1]
那就错了。

你看,当i=5时:
c+2d+3e=3*sum[5]-(3*a+3*b+2*c+d)=3*sum[5]-(sum[4]+sum[3]+sum[2]+sum[1]-sum[1]);
这明显和上面推导的公式不符。

这里我就不接着推了,公式是:
m*sum[i]-(s[i-1]-s[i-1-m])

代码:
#include <cstdio>
#include <cstring>
#include<iostream>
#include <algorithm>
using namespace std;
const int L = 1000010;
int sum[L],s[L]; int main()
{
int n,m,i,j,k,num;
while(~scanf("%d%d",&n,&m))
{
sum[0]=s[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&num);
sum[i]=sum[i-1]+num;
s[i]=s[i-1]+sum[i];
}
if(n<=m)
{
printf("%d\n",sum[n]);
continue;
}
int cnt,maxn=0;
for(int i=m;i<=n;i++)
{
cnt=m*sum[i]-(s[i-1]-s[i-1-m]);
maxn=max(maxn,cnt);
}
printf("%d\n",maxn);
}
return 0;
}



FZU 2168 防守阵地 I(公式推导)(经典)(中等)的更多相关文章

  1. FZU 2168 防守阵地 I

    Problem Description 部队中共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,按重要程度从低到高排序,依次以数字1到M标注每个地点的重要程度, ...

  2. FZU 2168 防守阵地 I(前n项和的前n项和)

    这是一道很容易超时的题,我超了n次了,后来队友提示我才想到,bigsum ! ! ! !就是前n项和的前n项和 #include<iostream> #include<cstdio& ...

  3. 福州大学 Problem 2168 防守阵地 I

    http://acm.fzu.edu.cn/problem.php?pid=2168 最重要的是 dp[k]=dp[k-1]-ans[k-1]+x[i]*m; ans[k-1]是m个数求和.  Pro ...

  4. FZU_Problem 2168 防守阵地 I

    Problem 2168 防守阵地 I Accept: 128 Submit: 392 Time Limit: 3000 mSec Memory Limit : 32768 KB Problem De ...

  5. fzu 2171 防守阵地 II

    Problem 2171 防守阵地 II Accept: 31    Submit: 112Time Limit: 3000 mSec    Memory Limit : 32768 KB  Prob ...

  6. FZU Problem 2168 防守阵地 I

    http://acm.fzu.edu.cn/problem.php?pid=2168 题目大意: 给定n个数和m,要求从n个数中选择连续的m个,使得a[i]*1+a[i+1]*2+--a[i+m]*m ...

  7. FZU2168——防守阵地 I——————【找规律或前缀和】

    防守阵地 I Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  8. FZU Problem 2171 防守阵地 II (线段树区间更新模板题)

    http://acm.fzu.edu.cn/problem.php?pid=2171 成段增减,区间求和.add累加更新的次数. #include <iostream> #include ...

  9. FZU2171:防守阵地 II(线段树)

     Problem Description 部队中总共同拥有N个士兵,每一个士兵有各自的能力指数Xi.在一次演练中,指挥部确定了M个须要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务.获得 ...

随机推荐

  1. Spartan6系列之GTP Transceiver的介绍与使用

    1.       什么是GTP transceiver? GTP transceiver是FPGA里一种线速度达500Mb/sà6.6Gb/s的收发器,利用FPGA内部可编程资源可对其进行灵活地配置, ...

  2. 安装好Pycharm后如何配置Python解释器简易教程

    呃呃,遇到坑了...... 安装完Python,没有去配置好Python解释器,直接打开Python项目包,去运行程序,程序输出结果只是显示 Process finished with exit co ...

  3. 12Microsoft SQL Server 索引

    Microsoft SQL Server 索引 8.1创建索引 CREATE INDEX idx_name ON table_name(列名) --创建非聚集索引 use student go cre ...

  4. BeanFactory的生命周期

    Bean自身的方法:调用Bean构造函数实例化Bean.调用setter设置Bean的属性值及通过<beam=n>的init-method和destory-method所制定的方法. Be ...

  5. ruby学习之路(一)

    学习ruby最好的方法就是下载源码包,里面带有sample和test,是入门学习的最好实例. 我下载的是2.1.0版本,首先./configure,然后make,sudo make install.从 ...

  6. TWaver MONO模板库新鲜出炉 精彩纷呈

    MONO Design在线3D建模平台网站, www.mono-design.cn,开发组的成员们已经开始紧锣密鼓的对这个平台进行内测.在之前的文章里,我们提到用户可以获得多种多样的TWaver官方模 ...

  7. [Python数据结构] 使用List实现Stack

    [Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...

  8. linux-vmstat-显示虚拟内存状态

    推荐:更多linux 性能监测与优化 关注:linux命令大全 vmstat命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程.内存.I/O等系统整 ...

  9. 在vue项目中快速使用element UI

    推荐使用npm安装 1.安装:npm install element-ui -S 2.整体引入: 在你项目的main.js中写入: import ElementUI from 'element-ui' ...

  10. 以位为单位存储标志-共用体-union

    一.程序的结构如下: typedef union _KEYST     {         struct         {             uint8 Key1_Flag :1;//表示第0 ...