cf 721 D Maxim and Array

昨天做的时候完全没思路,今天睡了一觉好多了。

对于一个数列,给k次操作,和一个常数x,每次操作可以让数列里的任意一个数加上或减去x,问k次操作后数列乘积最小的情况。

这题是贪心,下面先来证明两个东西。

1:给定一个都是正数的数列,让其中一个数加上x(正数),那么让最小的数加上x使数列各数的乘积最大。

数列:a,b,c,d,,,

任取两个数u,v;假设u>v;

对比 u*(v+x) 和v*(u+x) 因为u>v,所以u*v + u*x >u*v+v*x,所以,对于任意两个数,把x加到较小的数上可以使数列的乘积更大。

2:给定一个都是正数的数列,让其中一个数减去m(数列中存在小于m的数),让最小的数减去m可以得到最小的乘积。

数列:a,b,c,d,,,

任取两个数u,v;假设m>u>v;

对比u*(v-m) 和v*(u-m) ,因为u>v 所以u*v - um < u*v - vm<0但是|u*v - um|>| u*v - vm|,所以任意两个数(小于m),让较小的数减去m可以得到较小的值

任取连个数u,v;假设u>m>v;

这个就不用说了肯定减较小的数。

任取两个数;假设u>v>m;

对比u*(v-m) 和v*(u-m) ,因为u>v 所以0<u*v - um < u*v - vm,所以对于任意两个数(大于m),让较小的数减去m可以得到较小值。

从上面两个证明中,我们就得到了下面的结论。

对于一个数列:如果乘积为正,那么就让绝对值最小的数的绝对值变小;如果乘积为负,那么就让绝对值最小的那个数绝对值变大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值