LuoguP8480 PMTD

P8480 PMTD题解

题目背景

\(\text{uuku}\) 在学习四则运算

题目描述

为了验证 \(\text{uuku}\) 学习成果,\(\text{bh1234666}\) 给出一个长为 \(n\) 整数序列 \(a_i\)。并让 \(\text{uuku}\) 给这个序列进行 \(m\) 次操作。

每次操作可以任意选择序列中一个数 \(a_i\),令 \(a_i\) 变成 \(a_i+2\)\(a_i-2\)\(a_i\times 2\)\(\lfloor\frac{a_i}{2}\rfloor\) 这四个结果中的一个。

\(\text{bh1234666}\) 希望 \(m\) 次操作后,整个序列的极差(最大值减最小值)最大。

显然 \(\text{uuku}\) 没有认真学习,所以他希望你来帮他回答这个问题。

输入格式

第一行两个整数 \(n\)\(m\)

第二行 \(n\) 个整数,表示序列 \(a_i\)

输出格式

共一行一个整数,表示最大的极差。

样例 #1

样例输入 #1

3 2
0 1 0

样例输出 #1

6

样例解释

第一步操作:将 \(1\) 加上 \(2\) 得到 \(3\)

第二步操作:将 \(3\) 乘以 \(2\) 得到 \(6\)

极差为 \(6-0=6\)

数据范围

本题采用捆绑测试,共有 \(2\)\(\text{subtask}\),最终分数为所有 \(\text{subtask}\) 分数之和。

\[\def\arraystretch{1.5} \begin{array}{|c|c|c|}\hline \textbf{Task} & \textbf{Score} & \textbf{特殊限制} \cr\hline 1 & 40 & n \le 5,m \le 5 \cr\hline 2 & 60 & \cr\hline \end{array} \]

对于 \(100\%\) 的数据,\(2 \le n \le 10^6\)\(1 \le m \le 10\)\(0 \le a_i \le 10^9\)

分析

看似很难其实水题

易得:

找到最大值和最小值后,若最大值小于 \(2\) ,则先 \(+2\),再持续 $ \times 2$ 直至次数用完,若最大值大于等于 \(2\) 则持续 $ \times 2$ 直至次数用完。

答案即为最大值处理完毕减去最小值。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,a;
ll maxn=-1,minn=1000000009;//可用0x3f
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a);
		maxn=max(maxn,a);//最大值
		minn=min(minn,a);//最小值
	}
	for(int i=1;i<=m;++i){
		if(maxn<2)maxn+=2;
		else maxn*=2;//✖2
	}
	printf("%lld",maxn-minn);//极差输出
	return 0;
}

posted @ 2023-01-08 15:22  Qinzh  阅读(79)  评论(2)    收藏  举报