题目描述

元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

输入输出格式

输入描述:

包含n+2行:

第1行包括一个整数w,为每组纪念品价格之和的上限。

第2行为一个整数n,表示购来的纪念品的总件数。

第3~n+2行每行包含一个正整数pi (5 <= pi <= w),表示所对应纪念品的价格。

输出描述:

仅一行,包含一个整数,即最少的分组数目。

输入输出样例

输入样例#1:

100

9

90

20

20

30

50

60

70

80

90

输出样例#1:

6

思路

先将数据快排,然后for循环将第一个与最后一个相加,如果得数不大于纪念品价格之和的上限,第一个与最后一个为一组。否则,将第二个与最后一个匹配,以此类推。

代码

#include<stdio.h>
long long a[];
void qsort(int l,int r)
{
int i,j,mid,p;
i=l;j=r;
mid=a[(l+r)/];
do
{
while(a[i]<mid)
i++;
while(a[j]>mid)
j--;
if(i<=j)
{
p=a[i];
a[i]=a[j];
a[j]=p;
i++;j--;
}
}while(i<=j);
if(l<j)
qsort(l,j);
if(i<r)
qsort(i,r);
}
int main()
{
long long n,i,w,k=,j,l;
scanf("%lld%lld",&w,&n);
for(i=;i<=n;i++)
scanf("%lld",&a[i]);
qsort(,n);
l=;
for(i=n;i>=l;i--)
{
if(a[i]+a[l]<=w)
l++;
k++;
}
printf("\n%lld",k);
return ;
}

最新文章

  1. LinQ和ADO.Net增删改查 备忘
  2. Bomb---hdu5934(连通图 缩点)
  3. T4模板根据DB生成实体类
  4. 封装page分页类
  5. MySQL学习笔记(二)
  6. MySQL定时检查是否宕机并邮件通知
  7. Jquery 对话框确认
  8. grunt--自动化打包工具使用
  9. ThinkPHP配置文件的加载
  10. 策略模式-Strategy(Java实现)
  11. java包
  12. 2019春第九周作业Compile Summarize
  13. 安装mono和monoDevelop开发环境
  14. Docker 基础 (二)
  15. CC攻击原理及防范方法
  16. 基于VS2017的Docker Support体检ASP.NET Core站点的Docker部署
  17. thinkphp 随笔
  18. 撩课-Web大前端每天5道面试题-Day6
  19. Android Runtime.getRuntime().exec
  20. PMP十五至尊图(第六版)

热门文章

  1. 《3D Math Primer for Graphics and Game Development》读书笔记2
  2. JAVA理论概念大神之概念汇总
  3. 【转】如何让你的Android SDK下载或者升级快如闪电
  4. Python标准模块--logging
  5. 为 Neutron 准备物理基础设施(II) - 每天5分钟玩转 OpenStack(76)
  6. C#由变量捕获引起对闭包的思考
  7. react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware
  8. IOS开发之新浪围脖
  9. 【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题
  10. C# 将多个office文件转换及合并为一个PDF文件