和为给定数
内存限制: 128 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
给出若干个整数,询问其中是否有一对数的和等于给定的数。
输入格式
共三行:
第一行是整数 n ( 0 < n <= 1000000 ),表示有 n 个整数。
第二行是 n 个整数。整数的范围是在 0 到 10 ^ 8 之间。
第三行是一个整数 m(0 <= m <= 2 ^ 30 ),表示需要得到的和。
输出格式
若存在和为 m 的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行 No。
样例
样例输入
复制4
2 5 1 4
6
样例输出
复制1 5
数据范围与提示
upd:新增 Hack 数据,gm 的暴力跑不过去了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int n, m;
int a[maxn];
bool flag;
bool check(int l, int r) {
while(l < r) {
int mid = (l + r) / 2;
if(a[l] + a[r] == m) {
flag = true;
printf("%d %d", a[l], a[r]);
return true;
} else if(a[l] + a[r] < m) {
l++;
} else if(a[l] + a[r] > m) {
r--;
}
}
return false;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
sort(a + 1, a + n + 1);
int l = 1, r = n;
check(l, r);
if(flag == false) {
printf("No");
}
return 0;
}