题目描述
彩票站新上市了一种奇怪的刮刮乐,这种刮刮乐分为两个区,第一个区有 M 个数字,第二个区有 N 个数字,如果一个数字同时出现在 M 和 N 两个区,则说明中了这个数字作为金额的奖,现给出一张彩票,按照 M 区数字的顺序输出所有获奖的金额,并在最后输出总获奖金额。
输入
输入共 3 行。
第一行两个整数 M,N。
第二行 M 个整数分别表示 M 区的号码 X1,X2…XM。(保证各不相同)
第三行 N 个整数分别表示 N 区的号码 Y1,Y2…YN。(保证各不相同)
输出
对于每次中奖,输出中奖金额,两次中奖金额之间用空格隔开。
第二行输出总获奖金额。
样例输入
5 5
1 3 26 7 15
15 10 3 7 2
样例输出
3 7 15
25
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 1≤M,N≤100,000,1≤Xi,Yi≤1,000,000,000
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
int num1[100005], num2[100005];
for (int i = 0; i < m; i++) {
cin >> num1[i];
}
for(int j = 0; j < n; j++) {
cin >> num2[j];
}
sort(num2, num2 + n);
long long sum = 0;
int f = 0;
for (int i = 0; i < m; i++) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (num2[mid] == num1[i]) {
sum += num1[i];
if (f) cout << " ";
cout << num1[i];
f = 1;
}
if (num2[mid] < num1[i]) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
}
cout << endl;
cout << sum << endl;
return 0;
}