现在有正整数集合 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; }