P8480 题解

温馨提示: \color{#E74C3C}\text{温馨提示:} 温馨提示:

遇见题解勿抄袭,棕名封号两行泪。 \color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪。} 遇见题解勿抄袭,棕名封号两行泪。

题目传送门

本题易踩坑点:不开 long long \text{long long} long long 见祖宗

思路

这道题目是一道贪心的题目。贪心思想如下:

先排序,按从小到大排,排好之后对最后一项,即最大的一项,进行 +2×2操作,这样可以使得极差最大。

我们可以发现当 a n ≤ 1 a_n \le 1 an1 ,即 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 an1 ,那么进行 +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;
}

AC 记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值