当前位置:首页 > 竞赛 > 正文内容

题解:蓝桥例题3260最大区间和

MuWinds1个月前 (02-09)竞赛25

先发题目内容:

问题描述

小明是一名勇敢的冒险家,他在一次探险途中发现了一组神秘的宝石,这些宝石的价值都不同。但是,他发现这些宝石会随着时间的推移逐渐失去价值,因此他必须在规定的次数内对它们进行处理。

小明想要最大化这些宝石的总价值。他有两种处理方式:

  1. 选出两个最小的宝石,并将它们从宝石组中删除。

  2. 选出最大的宝石,并将其从宝石组中删除。

现在,给你小明手上的宝石组,请你告诉他在规定的次数内,最大化宝石的总价值是多少。

输入格式

第一行包含一个整数 t,表示数据组数。

对于每组数据,第一行包含两个整数 n 和 k,表示宝石的数量和规定的处理次数。

第二行包含 n 个整数 a1,a2,...,an,表示每个宝石的价值。

输出格式

对于每组数据,输出一个整数,表示在规定的次数内,最大化宝石的总价值。

样例输入

6
5 1
2 5 1 10 6
5 2
2 5 1 10 6
3 1
1 2 3
6 1
15 22 12 10 13 11
6 2
15 22 12 10 13 11
5 1
999999996 999999999 999999997 999999998 999999995

样例输出

21
11
3
62
46
3999999986

样例说明

在第一个测试用例中,两个最小值是 1 和 2,去掉它们,数组为 [5106],和为 21。而最大值为 10,去掉它,则数组为 [2,5,1,6],和为 14。最优的操作为执行一次操作一,得到最好的答案为 21

在第二个测试用例中,最优的处理结果先删除两个最小值,然后再删除一个最大值。

评测数据规模

对于 100% 的评测数据,1t10,3n2105,1k99999,2k<n

运行限制

语言最大运行时间最大运行内存
C++2s256M

蓝桥提供正解的思路是前缀和配合莫队算法,前缀和还好理解,这道题用莫队算法如何处理呢?

先说什么是莫队算法:
image.png

按照题目的要求,要么进行删掉一个最大的操作,要么就是一次性删掉两个价值最小的操作,总功能操作k次。

我们可以直接把k次操作全部放给删掉价值最大的宝石,然后每次k-1,删掉价值最大的宝石的次数也是k-1,而删除两个最小的宝石则是k+1,每一次遍历得到的结果与之前得到的最优解对比,最终找出价值最大的宝石来。

下面是代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5+9;
int a[N];
ll prefix[N];
 
int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while(t--){
        int n,k;
        cin >> n >> k;
        for(int i=1;i<=n;++i)   cin >> a[i];
 
        //先排序再构造前缀和数组
        sort(a+1,a+n+1);
        for(int i=1;i<=n;++i)   prefix[i]=prefix[i-1]+a[i];
 
        //左删除m次,那么右侧删除k-m次
        int m;  
        //mx用于存遍历m时的每组值,ans存最大值
        ll mx=0,ans=0;
        for(m=0;m<=k;++m){
            mx=prefix[n-k+m]-prefix[2*m];
            ans=max(ans,mx);
        }
        cout << ans << endl;
    }
    return 0;
}


“题解:蓝桥例题3260最大区间和” 的相关文章

PKU HPCGame 2nd WriteUp

1.签到题答案的第一位是1second number is eight叁:9最后一个是八第一题:1 8 9 8(北京大学的创校时间xD),这读完都知道在哪吧……2.小北问答1某厂的CPU采用了大小核架构,大核有超线程,小核没有超线程。已知物理核心数为12,逻辑核心数为16,大核数量为____,小核数...

记录模板题:图论-树:最近公共祖先(LCA)

模板题:洛谷p3379题目描述如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。输入格式第一行包含三个正整数 N,M,SN,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。接下来 N−1N−1 行每行包含两个正整数 x,yx,y,表示&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。