首页 > 编程语言 >第13届蓝桥杯青少年组C++第5题 金箍棒

第13届蓝桥杯青少年组C++第5题 金箍棒

时间:2023-02-20 15:35:20浏览次数:53  
标签:13 int 元素 操作数 C++ 中位数 蓝桥 测试用例 数组

解题思路

首先猜想最终相等的元素t的范围,最终应为数组中的某个元素。

  • t小于数组中所有的元素,则此时增大t,那么所有元素变为t的次数将减小,可见t并非最优解;
  • t大于数组中所有的元素,则此时减小t,那么所有元素变为t的次数将减小,可见t并非最优解;

可见t应该位于数组最大与最小值之间,下面证明最优的t可以取为数组中的某个元素,从而遍历数组元素即可。

如上图所示,设t为数组最大与最小值之间的一个值,若t不为数组中的某个元素,则设此时大于t的元素有x个,小于t的元素为y个。
x>y,则上移一格t,此时操作数变化量为-x+y<0,将会更优;
x<y,则下移一格t,此时操作数变化量为+x-y<0,将会更优;
x=y,则无论上移与下移,操作数不变。
因此,可以看出若t不取数组中的某个元素值,则总可以通过调整t,使得操作数更少。因此t应该取数组中的某个值。

问题转化为:
遍历数组中的数,找到某个元素t,使得t到其他元素值的距离之和最小。
绝对值不等式可知,当t取数组中位数时,该距离之和最小

中位数+绝对值不等式 \(AcWing\) \(104\). 货仓选址

排序之后取中位数,中位数的性质,所有数到他的和是最小的。

#include <bits/stdc++.h>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1010;
int a[N];
int n, k;
int res = INF;
// 时间复杂度:10000*10000=1e8,C++一秒可过
/**
 测试用例I:
 3 2
 3 6 1

 答案
 3

 测试用例II:
 4 2
 2 6 11 18

 答案:
 4
 解释:
 将2调到6,需要4步。
 也可以把2调到3,1步。
 把6降到3,3步,共4步。

 测试用例III:
 5 3
 2 6 11 18 14

 答案:
 7
 解释:
 将11调到14,需要3步
 将18调到14,需要4步,共7步。


测试用例IV
 5 3
 1 2 7 8 12
 答案:5
 解释:
 最终结果是8,
 7+1=8,1步
 8不需要动,0步
 12-8=4,4步
 共1+0+4=5步
 */
int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> a[i];

    for (int i = 0; i < n - k + 1; i++) { // 枚举起点
        vector<int> b;
        for (int j = i; j <= i + k - 1; j++) b.push_back(a[j]);                // 将每个可用范围复制到数组b中
        sort(b.begin(), b.end());                                              // 排序
        int cnt = 0;                                                           // 变更次数
        for (int j = 0; j < b.size(); j++) cnt += abs(b[b.size() / 2] - b[j]); // 枚举每个数字与中位数对比
        res = min(res, cnt);                                                   // 记录最少变更次数
    }
    printf("%d\n", res);
    return 0;
}

标签:13,int,元素,操作数,C++,中位数,蓝桥,测试用例,数组
From: https://www.cnblogs.com/littlehb/p/17137629.html

相关文章

  • 线段树板子C++
    structnode{intl,r,sum,lazy;node*lson,*rson;node(){l=r=sum=lazy=0;lson=rson......
  • 从C到C++
    从C到C++(二)目录从C到C++(二)一、域运算符C++中新增作用域标识符:::二、new、delete运算符new运算符可以用于创建堆空间三、重载四、namemanagling与extern“C”五、带默认......
  • C、C++、python、java
    C++和Python的区别python是一种脚本语言,是解释执行的,而C++是编译语言,是需要编译后在特定平台运行的。python可以很方便的跨平台,但是效率没有C++高。Python使用缩进来区......
  • C/C++学生选课管理系统[2023-02-20]
    C/C++学生选课管理系统[2023-02-20]4.15学生选课管理系统题目描述:假定有n门课程,每门课程有课程编号,课程名称,课程性质(必须/选修),学时,授课学时,实验或上机学时,学分等信......
  • 00013.07 内部类概述与分类以及匿名内部类的讲解
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参......
  • 00022.13 数据IO流:DataInputStream和DataOutputStream
    系列文章目录文章目录​​系列文章目录​​​​一、DataInputStream是什么?​​​​二、DataOutputStream​​​​代码​​一、DataInputStream是什么?二、DataOutputStream代......
  • HDOJ1013 Digital Roots
    题目链接:​​DigitalRoots​​给出一个正整数,然后将该整数的每一位加起来,如果是只有个位数,就输出。如果还大于10,就继续将每一位加起来,直到只有个位数。但是值得注意的是,题......
  • HDOJ2113 Secret Number
    题目链接:​​SecretNumber​​计算出给定数各个位上数字为偶数的和。题目说明了在int范围里了。只要每一位都判断一下是否%2==0importjava.util.Scanner;publicclassMai......
  • C++ primer 5th 第一章阅读笔记
    第一章开始第一节编写一个简单的C++程序不同编译器使用不同的后缀命名约定,比如cc、cpp、c。比如main程序保存到prog1.cc中,可以使用如下命令来编译它:ccprog1.cc。其中......
  • HDOJ2132 An easy problem
    AneasyproblemTimeLimit:3000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):14373    AcceptedSubmission(s)......