当前位置: 首页 > news >正文

蓝桥杯备赛-前缀和-可获得的最小取值

问题描述

妮妮学姐手头有一个长度为 nn 的数组 aa,她想进行 kk 次操作来取出数组中的元素。每次操作必须选择以下两种操作之一:

  • 取出数组中的最大元素。
  • 取出数组中的最小元素和次小元素。

妮妮学姐希望在进行完 kk 次操作后,取出的数的和最小。她感觉有些困难,于是请擅长贪心的你帮助她解决这个问题。

输入格式

第一行输入两个整数 nn 和 kk ,表示数组长度和操作次数。

第二行输入 nn 个整数表示数组 aa 。

数据范围保证 3≤n≤2×105,1≤ai≤109,1≤k≤99999,2k<n3≤n≤2×105,1≤ai​≤109,1≤k≤99999,2k<n 。

输出格式

样例输入

5 1
2 5 1 10 6

样例输出

3#include <iostream>
#include<vector>
#include <algorithm>
#include <climits> // 用于 INT_MAX 或 LLONG_MAX
using namespace std;
//贪心不对:每次在操作(1)和操作(2)中选较小的值。
//例如{3, 1, 1, 1, 1, 1, 1},做k=3次操作,每次都按贪心法
//做3次操作(2),结果是6。但是正确答案是做3次操作(1),结果是5。
//设操作(2)做p次,操作(1)做k-p次:ans=sum[2p]+sum[n]-sum[n+p-k],尝试所有可能的p
int main()
{
  int n,k;
  cin>>n>>k;//不是n,k
  vector<int> a(n+1,0);
  vector<long long> sum(n+1,0);
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
  }
  sort(a.begin()+1,a.end());
  //对1-n进行排序
  //!!!!!!a和sum要分开写,sum的计算要在排序之后
  for(int i=1;i<=n;i++)
  {
    sum[i]=sum[i-1]+a[i];
  }
  long long ans=LLONG_MAX;//存疑
  for(int p=1;p<=k;p++)
  {
    ans=min(ans,sum[2*p]+sum[n]-sum[n-k+p]);//不是2p
  }
  cout<<ans;
  return 0;
}

说明

对于样例,我们通过操作 22 取出 11 和 22 可以获得最小值。

相关文章:

  • 信号处理:互相关函数
  • 蓝桥与力扣刷题(蓝桥 特别数的和)
  • 论文:KernelBench: Can LLMs Write Efficient GPU Kernels?
  • centos虚拟机无法安装工具
  • Android开发奇葩bug:布局宽高不自动自适应了
  • 月份天数总结
  • 【考试大纲】高级系统架构设计师考试大纲
  • 【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
  • 连锁管理系统的五大核心功能及系统设计
  • Python数字图像处理:直方图均衡化
  • 歌曲分类和流行度预测
  • 需求和开发模型
  • 旁挂组网双机热备负载分担
  • ubuntu离线安装nvidia-container-runtime
  • c++信息学第一阶段练习题
  • 在 MySQL 中,删除数据库和表后,自动递增的值通常会被重置为初始值,一般是 1。但如果自动递增不为零,可能有以下原因及解决办法:
  • 深入探索Python机器学习算法:监督学习(线性回归,逻辑回归,决策树与随机森林,支持向量机,K近邻算法)
  • IO和NIO
  • 每日学习Java之一万个为什么?[MySQL面试篇]
  • OAK相机的抗震性测试
  • 西宁网站建设多少钱/云和数据培训机构怎么样
  • 网站群建设方案/seo基本步骤
  • 彩票网站建设平台/推广文章的推广渠道
  • 做网站的财务需求/seo推广系统排名榜
  • 网站建设优化外包/效果好的关键词如何优化
  • 外国人做的网站/营销软件有哪些