题意:给出一堆数据和m,求出是否有两个数的和为m,如果有,输出两个差的绝对值最小的两个数。
思路:记录出现的数字,对于每个数字a,查询是否前面的数字是否有b = m - a,如果有比较差的绝对值。注意m-a>0;
这里要注意一点,因为数据比较多,如果用map存的话,复杂度为nlongn,铁定会超时,所以直接用数组去存,内存也够。
代码:
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAX = 2000100;
const int INF = 0x3f3f3f3f;
int d[MAX];
template <class T>
inline bool read( T &n)
{
T signal = 1;
T x = 0;
char ch = getchar();
while((ch < '0' || ch > '9') && ch != EOF && ch != '-')
ch = getchar();
if(ch == EOF)
return false;
if(ch == '-')
signal = -1,ch = getchar();
while(ch >= '0' && ch <= '9'){
x *= 10;
x += ch -'0';
ch = getchar();
}
n = signal * x;
return true;
}
int main(void)
{
int T;
scanf("%d", &T);
while(T--){
memset(d,0,sizeof(d));
int n,m;
scanf("%d%d", &n,&m);
int res = INF;
for(int i = 0 ; i < n ; ++i)
{
int tmp;
read(tmp);
if(m - tmp > 0 &&d[m - tmp] > 0)
{
if(res == INF)
res = tmp;
else if(abs(m - 2 * res) > abs(m - 2 * tmp)){
res = tmp;
}
}
d[tmp]++;
}
if(res == INF)
printf("Sad\n");
else
{
int mm = max(res,m -res);
int nn = min(res,m -res);
printf("%d %d\n",nn,mm);
}
}
return 0;
}