zoukankan      html  css  js  c++  java
  • NOI Online #3 提高组 T1水壶 题解

    题目描述

    有 n 个容量无穷大的水壶,它们从 1∼n 编号,初始时 i 号水壶中装有 Ai 单位的水。

    你可以进行不超过 k 次操作,每次操作需要选择一个满足 1≤x≤n−1 的编号 x,然后把 x 号水壶中的水全部倒入 x+1 号水壶中。

    最后你可以任意选择恰好一个水壶,并喝掉水壶中所有的水。现在请你求出,你最多能喝到多少单位的水。

    输入格式

    第一行一个正整数 n,表示水壶的个数。

    ​第二行一个非负整数 k,表示操作次数上限。

    ​第三行 n 个非负整数,相邻两个数用空格隔开,表示水壶的初始装水量 A1、A2⋯An。

    输出格式

    一行,仅一个非负整数,表示答案。

    输入输出样例

    输入 #1

    10
    5
    890 965 256 419 296 987 45 676 976 742

    输出 #1

    3813

    分析

    这道题比之前的T1友好多了

    首先,倒水的这几个水壶肯定要相连,否则不会产生最大的价值

    那么我们就可以把问题转化为在一个序列中求一段长度固定的区间的和,使这个和最大

    这样的话我们用前缀和记录一下就好了,复杂度为O(n)

    这道题唯一需要注意的是倒k次水,区间的长度为k+1

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int maxn=1e6+5;
    ll a[maxn],qzh[maxn];
    int main(){
        ll n,k;
        scanf("%lld%lld",&n,&k);
    
        for(ll i=1;i<=n;i++){
            scanf("%lld",&a[i]);
    
            qzh[i]=a[i]+qzh[i-1];
        }
        k++;
        ll ans=-1;
        for(ll l=1;l<=n;l++){
            ll r=l+k-1;
            if(r>n) break;
    
            ans=max(ans,qzh[r]-qzh[l-1]);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    Django 标签过滤器
    Python短路原则
    python学习之路 八 :面向对象编程基础
    python学习之路 七 :生成器、迭代器
    python学习之路 六 :装饰器
    python学习之路 五:函数式编程
    python学习之路 四 :文件处理
    python学习之路 三:字符编码
    机器学习流程管理
    pyspark 自定义聚合函数 UDAF
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/12950963.html
Copyright © 2011-2022 走看看