温馨提示: \color{#E74C3C}\text{温馨提示:} 温馨提示:
遇见题解勿抄袭,棕名封号两行泪。 \color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪。} 遇见题解勿抄袭,棕名封号两行泪。
本题易踩坑点:不开 long long \text{long long} long long 见祖宗
思路
这道题目是一道贪心的题目。贪心思想如下:
先排序,按从小到大排,排好之后对最后一项,即最大的一项,进行 +2
或 ×2
操作,这样可以使得极差最大。
我们可以发现当 a n ≤ 1 a_n \le 1 an≤1 ,即 a n = 0 a_n=0 an=0 或 a n = 1 a_n=1 an=1 ,那么 a n × 2 < a n + 2 a_n \times 2 < a_n + 2 an×2<an+2
所以我们需要判断如果
a
n
≤
1
a_n \le 1
an≤1 ,那么进行 +2
操作能使最后一项尽可能的大。
反之如果
a
n
>
1
a_n > 1
an>1 ,那么进行 ×2
操作能使最后一项尽可能的大。
因为我们只操作 a n a_n an ,且都使其变大,所以操作结束后,最大值和最小值分别为 a n a_n an 和 a 1 a_1 a1,输出他们的差即可。
Coding Time \text{Coding Time} Coding Time
ps: 有防抄袭,仔细看就会发现。
#include <bits/stdc++.h>
using namespace std;
#define int long long//你想见祖宗吗?
int n,m;
int a[1000005];
signed main()
{
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);//按从小到大排序
while (m--)//m次操作都是对最后一项进行
{
if(a[n]<=1)//如果最后一项 ≤ 1 ,则进行+2操作
{
a[n]+=2;//具体原因见上方 “思路” 部分
}
else//反之相反
{
a[n]*=2;//具体原因见上方 “思路” 部分
}
}
cout<<a[n]-a[1]<<endl;//输出极差
return 1;
}