算法题:一起来挑战GCJ

学习博客:书本知识加上自身理解更好的描述分享与大家😝

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;<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值