现在有正整数集合 A 和 B,每个集合里有 N 个数,你要建立他们间的一一映射
将每对配对的数字相加可以得到 N 个和,你要做的就是最大化第 K 大的和
1≤K≤N≤100,000 输入的所有数字不超过 108

贪心:不从整体最优上加以考虑,而是在某种意义上的局部最优解

  • 本题的最终走向是发现倒序相加会使得和的大小更平均,局部情况会出现第K大的最大情况。

思考模式 倒序
假设现在有两组集合A/B,每个集合里有10个数。
我需要第7大的和的最大化值。
(以下代码实现的是以B作寻找组,便于理解代码才这么形容)

以B中的第四小的数与A中最大数相加;
////// B[N-K+i] = [10-7+0]从B组的第七大开始,即B[3];

以B中的第五小的数与A中第二大数相加;
……
以B中最大的数与A中第七大的数相加;
有个问题???为什么不以A作寻找组呢
当然可以,题解中给出的是以B作寻找组,在这循环实现的最后一步可以看出选择A与B作寻找组是相同的结果。
(这是之前一直在我脑海里想不通的地方,现在全部列出来终于明白了)

最后升序排列,取首个数字即为第7大的和的最大化值。

using namespace std;
#define M 100005
int main()
{
    int N,K;
    long long A[M],B[M],sum[M];
    cin>>N>>K;
    for(int i=0;i>A[i];
    for(int i=0;i>B[i];
    sort(A,A+N,greater<long long>());sort(B,B+N);// A降序排 B升序排
    for(int i=0;i<K;i++)
    {
        sum[i]=A[i]+B[N-K+i];         //倒序一边作和比较
    }
    sort(sum,sum+K);
    cout<<sum[0];
    return 0;
}