一起来挑战GCJ(1)
学习博客:书本知识加上自身理解更好的描述分享与大家😝
2.7.1 Minimum Scalar Product
题述: 有两个向量 v1={x1,x2,x3,…xn}和 v2 ={y1,y2,y3,y4…yn},允许任意交换 v1和v2各自的分量的顺序。请计算 v1 和 v2的内积
x1y1+。。。+ xnyn 的最小值。
题解:
@1:如果我们先固定 v1的排列顺序,之后枚举 v2的排列,之后计算汇总求最小值,这样的话 复杂度为 O(n!*n) ,这是非常大的,如果n很大,我们很容易超出时间限制。
@2:我们直觉将 v2 按照降序排列, v1按照升序排列,我们使用 n=2进行证明这一观点,(这时 x1>x2, y1<y2)
共有两种分组: x1y1 + x2y2 x1y2 + x2y1 ,我们很容易看出 第二组更小。
这时我们推至 n > 2 ,依旧可以很清楚看到 第二组情况最小。
这时提一句: v1 升序,v2降序 和v2升序,v1降序得到的结果是相同的。😝
代码如下:
using ll=long long;
ll GetMinInnerProduct(vector<int> &ivec1,vector<int> &ivec2){
sort(ivec1.begin(),ivec1.end());
sort(ivec2.begin(),ivec2.end(),[](int &a,int &b){
return a>b;});
ll innerProduct=0;<