2014新生暑假个人排位赛04 A. 大家一起点外卖

外卖组合优化问题
本文探讨了一个外卖点餐组合问题,旨在寻找两个餐点费用之和等于特定值且价格差最小的组合,通过算法实现了最优解决方案。
时间限制 2000 ms 内存限制 65536 KB

题目描述

大家都回了本部,本部生活虽然没有宏福天(mo)堂(gui)般的生活,但是却有很多外卖,今天有一家饭店新开张,凡是两个人的餐点费用之和刚好为m可以免运费,在今天一起点外卖且免运送费的两个人,各自点的外卖价格差值最小的有大惊喜。在机房的n个同学今天打算一起点外卖,但是每个人都只想要点某一个价格x的餐点,请你帮忙规划一下大家应当如何组合,并给出最有可能获得今天大惊喜的价格组合。

输入格式

第一行输入样例数T 对于每一个样例 第一行输入整数n(0 n500000),整数m(0m2000000) 接下来的n行,每行输入一个整数x代表每一个人想点的餐点的价格 0x1000000

输出格式

如果能够找到最有可能获得今天大惊喜的价格组合,则输出两个人所点的餐点的价格,小的价格在前。
如果所有人都没办法免运送费,则输出“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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值