长安大学第四届“迎新杯”程序设计竞赛 H 圣诞节糖果【二分】

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

圣诞节临近,彩虹岛的黑心商人???的糖果店又开始热闹了起来,热心的???来到???的店里面帮忙包装糖果。店里面共有?堆糖果,其中第?堆有??颗糖果,???让???从中选择两堆糖果,这两堆糖果中每? 颗包装在一起,如果最后还有剩余就归???所有了,若两堆不足?个则全部归???所有。作为糖果狂热爱好者,???当然是想拿走尽量多的糖果,因此他想知道自己最多能够拿走多少糖果。

输入描述:

输入第一行为一个整数?(1 ≤ ? ≤ 10),表示一共有?组测试数据。
对于每组测试数据:
第一行有两个整数?(2 ≤ ? ≤ 105), ?(1 ≤ ? ≤ 109),分别表示糖果堆数和包装后每包糖果的数量。
第二行有?个整数,其中第?个数??(1 ≤ ?? ≤ 109)表示第?堆糖果的数量。

输出描述:

对于每组测试数据,输出一个整数?表示???能拿走的最多的糖果数目。
示例1

输入

2
4 5
1 4 2 3
4 15
12 19 13 20

输出

4
10

说明

对于第一组样例,???选择第一堆和第四堆是最佳选择,会剩余4颗糖果。
对于第二组样例,???选择第一堆和第三堆是最佳选择,会剩余10颗糖果。

【分析】:有个技巧,在输入时就可以%p,再排序,二分查找合法的最大
【代码】:
#include<stdio.h>
#include<algorithm>
#include <iostream>
#include<string>
#include<math.h>
using namespace std;
int a[100005];
int main()
{
    int n,t,b,c,d,i,max,p,j,low,high;
    cin>>t;
    while(t--)
    {
            cin>>n>>p;
            for(i=0;i<n;i++)
            {
                cin>>a[i];
                a[i]%=p;
            }//每? 颗包装在一起,
            sort(a,a+n);
            low=0,high=n-1;
            max=(a[n-1]+a[n-2])%p;
            while(low<high)
            {
                while((a[low]+a[high]>=p))//如果两堆糖果中每? 颗包装在一起,如果最后还有剩余就归???所有了,
                    high--;
                if(low<high)//两堆不足?个则全部归???所有
                {
                    if(max<a[low]+a[high]) 
                         max=a[low]+a[high];
                    low++;
                }
            }
            cout<<max<<'\n';
    }
}
View Code

 

转载于:https://www.cnblogs.com/Roni-i/p/8052960.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值