zoukankan      html  css  js  c++  java
  • 订单

    订餐

    dish.c/cpp/pas

    (1s/256M)

    【题目描述】

    这个周末,Joe一如既往的拿出了外卖的点餐单。菜单上从上到下列着N个菜,每个菜Joe列出一个美味值。Joe这次希望从菜单上连续地K个菜,并且美味值之和最大。 

    在计算美味值之和时,Joe有自己的一套计算方法:由于他会按照顺序享受这K个菜,并且越吃越后面的菜他就越享受,所以对于他吃的第i个菜,它的美味值为D美味值之和就会加上D*i例如,如果他要顺序吃美味值为3, 8, 5的菜,那么美味值之和为3 + 8*2 + 5*3 = 34 

    Joe给出了这N个菜的美味值,想知道所能达到最大的美味值之和。 

    【输入格式】dish.in

    第一行两个整数NK代表菜的总和他要选择的菜数。

    第二行N个整数,代表从上到下菜单上菜品的美味值。

    【输出格式dish.out

    一行一个整数,代表最大的美味值之和。

    【样例输入】

    5 3

    2 4 1 5 3

    【样例输出】

    21

    【数据规模与范围】

    对于40%的数据,N,K<=2000;

    对于100%的数据,N,K<=100000菜品的美味值D满足0<=D<=1000.

    思路:

      保留原来数据,从左向右移动。

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<ctime>
    using namespace std;
    const int N=100009;
    int a[N];
    long long f[N],maxn,tot;
    int n,k;
    int main()
    {
        freopen("dish.in","r",stdin);
        freopen("dish.out","w",stdout);
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            f[i]=f[i-1]+a[i];
        }
        int L=1,R=k;
        for(int i=1;i<=k;i++)
            maxn=maxn+a[i]*i;
        tot=maxn;
        for(R=R+1,L++;R<=n;R++,L++)
        {
            tot=(tot+a[R]*k-(f[R-1]-f[L-2]));
            if(tot>maxn)
                maxn=tot;
        }
        cout<<maxn<<endl;
        return 0;
    }
  • 相关阅读:
    如何实时抓取动态网页数据?
    产品经理面试——简历填写
    项目章程
    IDEA 必要配置
    项目章程
    基础知识02 零基础入门学习汇编语言02
    基础知识03 零基础入门学习汇编语言03
    进制转换教程
    基础知识04 零基础入门学习汇编语言04
    基础知识01 零基础入门学习汇编语言01
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7715803.html
Copyright © 2011-2022 走看看