D-莲子的物理热力学
admin
2024-02-18 00:00:23

D-莲子的物理热力学

题目背景

莲子正在研究分子的运动。

每个分子都有一个速度,约定正方向为正,负方向为负。分子的数量极多,速度又并不一致,看上去杂乱无章。于是莲子希望调整部分分子的速度,使得最终分子们看上去整齐。

题目描述

莲子给定了 nnn 个整数 a1,a2,⋯ana_1,a_2,\cdots a_na1​,a2​,⋯an​,描述每个分子。现在她可以进行至多 mmm 次操作(也可以一次也不进行),每次操作可以执行以下两条之一:

  • 选择 iii,满足 ai=min⁡j{aj}a_i=\min_j\{a_j\}ai​=minj​{aj​},然后将 aia_iai​ 变为 max⁡j{aj}\max_j\{a_j\}maxj​{aj​}。
  • 选择 iii,满足 ai=max⁡j{aj}a_i=\max_j\{a_j\}ai​=maxj​{aj​},然后将 aia_iai​ 变为 min⁡j{aj}\min_j\{a_j\}minj​{aj​}。

现在莲子希望需要最小化最终序列的极差(最大值减去最小值的差)。请求出最小的极差。


例如,对于序列 a={5,1,4}a=\{5,1,4\}a={5,1,4},可以进行如下几次操作:

  • 选择 i=1i=1i=1,满足 a1=5a_1=5a1​=5 是当前的最大值 555,可以将 a1a_1a1​ 修改成当前的最小值 111,此时序列变成 {1,1,4}\{1,1,4\}{1,1,4};
  • 再选 i=2i=2i=2,满足 a2=1a_2=1a2​=1 是当前的最小值 111,可以将 a2a_2a2​ 修改成当前的最大值 444,此时序列变成 {1,4,4}\{1,4,4\}{1,4,4}。

这两次操作后得到的序列为 {1,4,4}\{1,4,4\}{1,4,4}。最大值减去最小值的差为 ∣4−1∣=3|4-1|=3∣4−1∣=3。

当然,这种操作方式得到的极差并非最小。最优策略是,先将最大值 a1=5a_1=5a1​=5 变成目前的最小值 111,再把此时的最大值 a3=4a_3=4a3​=4 变成目前的最小值 111。此时序列为 {1,1,1}\{1,1,1\}{1,1,1},得到的极差 ∣1−1∣=0|1-1|=0∣1−1∣=0 是所有策略中最小的。

输入格式

  • 第一行有两个正整数 n,mn,mn,m,分别表示序列的长度和你最多可以进行的操作次数。
  • 第二行有 nnn 个整数 aaa,描述给定的序列。

输出格式

  • 输出共一行一个整数,表示最优策略下能得到的最小极差。

样例 #1

样例输入 #1

3 2
5 1 4

样例输出 #1

0

样例 #2

样例输入 #2

8 0
1 2 3 4 5 6 7 8

样例输出 #2

7

样例 #3

样例输入 #3

8 3
1 5 5 5 6 6 9 10

样例输出 #3

4

提示

样例解释

样例 111:{5,1,4}→{1,1,4}→{1,1,1}\{5,1,4\}\to\{1,1,4\}\to\{1,1,1\}{5,1,4}→{1,1,4}→{1,1,1},极差为 000。
样例 222:{1,2,3,4,5,6,7,8}\{1,2,3,4,5,6,7,8\}{1,2,3,4,5,6,7,8},什么也做不了,极差为 777。
样例 333:{1,5,5,5,6,6,9,10}→{10,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,5}\{1,5,5,5,6,6,9,10\}\to\{10,5,5,5,6,6,9,10\}\to\{5,5,5,5,6,6,9,10\}\to\{5,5,5,5,6,6,9,5\}{1,5,5,5,6,6,9,10}→{10,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,5},极差为 444。

数据范围及约定

对于全部数据,保证 1≤n≤1051\le n \le 10^51≤n≤105,0≤m≤1090\le m\le10^90≤m≤109,∣ai∣≤109|a_i|\le 10^9∣ai​∣≤109。

题解

#include
#include
using namespace std;
const int N = 1e5 + 10;
int num[N], n, m;int main() {cin >> n >> m;for(int i = 0; i < n; i++ ) {cin >> num[i];}sort(num, num + n, [](int x, int y){return x < y;});int res = num[n - 1] - num[0];if(n > m) {for(int i = 0; i <= m / 2; i++ ) {int k = n - 1 - (m - i * 2);res = min(res, num[k] - num[i]);}for(int i = 0; i <= m/2 ; i++ ) {int k = (m - i * 2);res = min(res, num[n - 1 - i] - num[k]);}} else {res = 0;}cout << res << endl;return 0;
}

相关内容

热门资讯

最新或2023(历届)大学生毕...   活动前言:  呼吸仍在继续,你可曾真正在意过它的跳动;时光唱着的仍然是喧宾夺主的高调。眨眼、转身...
最新或2023(历届)大学生主...  一、班会主题:  助人为乐情常在,雷锋精神心永存。  二、活动背景:  1963年3月5日,毛泽东...
谁更该为山村教师寻找继任者 谁... 湖北保康县黄堡镇大安村教学点59岁山村教师董朝兵即将退休,他带的10名山里学生面临无人接续教学的窘境...
七八个月入不了编何谈简政放权 ... 多个部门对教师有管理的权利,导致了管理的越位,而教师的应得权益又没有谁去维护,出现不该出现的缺位。 ...
山东推进教师县管校聘交流 义务... 本报济南4月14日讯(记者 魏海政)山东省政府今天举行新闻发布会,推出县域义务教育学校校长教师交流轮...