题解:P12218 [蓝桥杯 2023 国 Java B] 玩具

· · 题解

思路

首先把 n*2,再把 w 数组排序,可以发现,如果要使权值最小,只能:

w_0*w_{n-1}+w_1*w_{n-2}+\ldots

我们可以用双指针来实现。

另:因为 w_i 最大为 10^5 所以要用 long long。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    n*=2;//先把n*2
    vector<int> w(n);
    for(int i=0;i<n;i++) cin>>w[i];
    sort(w.begin(),w.end());//排序
    int l=0,r=n-1;//双指针,l和r分别赋值为0和n-1
    long long ans=0;
    while(l<r){
        ans+=(long long)w[l]*w[r];//大的+小的
        l++;
        r--;
    }
    cout<<ans;
    return 0;
}

谢谢观看!