昨天做的时候完全没思路,今天睡了一觉好多了。
对于一个数列,给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可以得到较小值。
从上面两个证明中,我们就得到了下面的结论。
对于一个数列:如果乘积为正,那么就让绝对值最小的数的绝对值变小;如果乘积为负,那么就让绝对值最小的那个数绝对值变大。