纪念品分组
来源:互联网 发布:软件开发工作进度表 编辑:程序博客网 时间:2024/04/28 21:23
【题目描述】
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
【输入】
输入文件group.in包含n+2行:
第1行包括一个整数w,为每组纪念品价格之和的上限。
第2行为一个整数n,表示购来的纪念品的总件数。
第3~n+2行每行包含一个正整数pi (5 <=pi <= w),表示所对应纪念品的价格。
【输出】
输出文件group.out仅一行,包含一个整数,即最少的分组数目。
【输入输出样例】
group.in
group.out
100
9
90
20
20
30
50
60
70
80
90
6
【限制】
50%的数据满足:1 <= n <= 15
100%的数据满足:1 <= n <= 30000, 80 <=w <= 200
附AC码:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h> int a[10001];void qsort(int l,int r){ int i,j,x,y; i=l;j=r;x=a[(l+r)/2]; do { while(a[i]<x)i++; while(a[j]>x)j--; if(i<=j) { y=a[i];a[i]=a[j];a[j]=y; i++;j--; } }while(i<=j); if(i<r) qsort(i,r); if(l<j) qsort(l,j);}int main(){ int w,n,i,j,k,m,gr; //freopen("group.in","r",stdin); //freopen("group.out","w",stdout); scanf("%d\n%d",&w,&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); qsort(1,n); i=1;j=n; while(i<=j) { if(a[i]+a[j]<=w)i++; j--;gr++; } printf("%d\n",gr); return 0;}
0 0
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 纪念品分组
- 【其他】【RQNOJ】纪念品分组
- 深度优先搜索
- Design Pattern(10)-Immutable Pattern
- 【shell脚本】如何用shell编写一个进度条
- Java开发中的23种设计模式详解(转)
- 我的Qt学习之路 --- 2、编写Qt多窗口程序
- 纪念品分组
- 图片加载框架Glide使用详解
- 实现各种类型的冒泡排序
- js+dom娱乐之table排序
- 面向对象
- 39. Combination Sum(第五周)
- Struts和Spring MVC对比
- Activity 生命周期
- 网络攻防之——kali中的其他扫描工具