长安大学第四届“迎新杯”程序设计竞赛 H 圣诞节糖果【二分】
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制: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'; } }
分类:
基本算法-二分
, OJ-Newcoder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决