A. 大家一起点外卖
时间限制 2000 ms 内存限制 65536
KB
题目描述
大家都回了本部,本部生活虽然没有宏福天(mo)堂(gui)般的生活,但是却有很多外卖,今天有一家饭店新开张,凡是两个人的餐点费用之和刚好为m可以免运费,在今天一起点外卖且免运送费的两个人,各自点的外卖价格差值最小的有大惊喜。在机房的n个同学今天打算一起点外卖,但是每个人都只想要点某一个价格x的餐点,请你帮忙规划一下大家应当如何组合,并给出最有可能获得今天大惊喜的价格组合。
输入格式
第一行输入样例数T 对于每一个样例 第一行输入整数n(0≤ n≤500000),整数m(0≤m≤2000000) 接下来的n行,每行输入一个整数x代表每一个人想点的餐点的价格 0≤x≤1000000
输出格式
如果能够找到最有可能获得今天大惊喜的价格组合,则输出两个人所点的餐点的价格,小的价格在前。
如果所有人都没办法免运送费,则输出“Sad”
输入样例
2
2 3
1
3
4 3
1
2
3
4
输出样例
Sad
1 2
注意abs绝对值。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<map>
#define N 2000500
#define M 999999999
using namespace std;
int rec[N],i,j,k,t,n,m,x,Min;
int main(){
scanf("%d",&t);
for(i=0;i<t;i++){
Min=M;
memset(rec,0,sizeof(rec));
scanf("%d%d",&n,&m);
for(j=0;j<n;j++){
scanf("%d",&x);
if(x<=m){
if(rec[m-x]!=0&&abs(x-(m-x))<Min){
Min=abs(x-(m-x));
}
}
rec[x]++;
}
if(M==Min)printf("Sad\n");
else{
int big,small;
big=(m+Min)/2;
small=m-big;
printf("%d %d\n",small,big);
}
}
return 0;
}