九度-1534-数组中第K小的数字[解题代码] | Acm之家
给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。
譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。
现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。
long mid=low+((high-low)>>1);
Read full article from 九度-1534-数组中第K小的数字[解题代码] | Acm之家
给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。
譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。
现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。
long mid=low+((high-low)>>1);
//统计小于等于 mid 的个数 |
11 | lld cntMin(lld mid){ |
12 | lld cnt = 0; |
13 | lld j = n-1; |
14 | for ( int i=0; i<m; i++){ |
15 | //由于已排序,可直接利用上一次结果 |
16 | while (j >= 0 && arr1[i] + arr2[j] > mid) j--; |
17 | cnt += j+1; |
18 | } |
19 | return cnt; |
20 | } |
21 |
22 | lld low,high,mid; |
23 | int main() { |
24 | while ( scanf ( "%lld%lld%lld" , &m,&n,&k) != EOF){ |
25 | for (lld i=0; i<m; i++) scanf ( "%lld" , &arr1[i]); |
26 | for (lld j=0; j<n; j++) scanf ( "%lld" , &arr2[j]); |
27 | sort(arr1, arr1+m); |
28 | sort(arr2, arr2+n); |
29 | low = arr1[0] + arr2[0]; |
30 | high = arr1[m-1] + arr2[n-1]; |
31 | lld ans; |
32 | //二分逼近 |
33 | while (low <= high){ |
34 | mid = (low+high)/2; |
35 | lld cnt = cntMin(mid); |
36 | if (cnt >= k){ |
37 | ans = mid; //mid有可能是解 |
38 | high = mid-1; |
39 | } else |
40 | low = mid+1; |
41 | } |
42 | printf ( "%lld\n" ,ans); |
43 |
44 | } |
45 | return 0; |
46 | } |