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}\) 分数之和。
对于 \(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;
}

浙公网安备 33010602011771号