FZU 2168

来源:互联网 发布:阿里妈妈解绑淘宝账号 编辑:程序博客网 时间:2024/06/05 16:53
Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status Practice FZU 2168

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

每次数据一大就蒙蔽了

又是一道考察时间复杂度的题,技巧就在把M个数存为一组,下一组时再减去前面一组完成乘法

这题是队友写出来的,像我这种傻逼怎么可能找到这种规律,,,,突然不想明天到来了,,,感觉要得抑郁症了

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=1000011;
int x[N], sum[N], c[N];


int main()
{
    int n, m;
    while(scanf("%d %d",&n, &m)!=EOF)
    {
        memset(x,0,sizeof(x));
        memset(sum,0,sizeof(sum));
        memset(c,0,sizeof(c));
        int Max=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x[i]);
            if(i<=m)
            {
                sum[m]+=i*x[i];
                c[m]+=x[i];
            }
            else
            {
                sum[i]=sum[i-1]-c[i-1]+m*x[i];//思想
                c[i]=c[i-1]-x[i-m]+x[i];
            }
            Max=max(Max,sum[i]);
        }
        cout<<Max<<endl;
    }
    return 0;
}

0 0
原创粉丝点击