Vijos 1409-纪念品分组【贪心】

来源:互联网 发布:ubuntu系统如何安装qq 编辑:程序博客网 时间:2024/04/29 23:30
P1409纪念品分组
Accepted
标签:NOIP普及组2007[显示标签]

描述

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

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

【限制】

50%的数据满足: 1 <=n <= 15

100%的数据满足: 1 <= n <= 30000, 80 <= W <= 200

格式

输入格式

第1行包括一个整数w,为每组纪念品价格之和的上限= 第2行为一个整数n,表示购来的纪念品的总件数G

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

输出格式

仅1行,包含一个整数, ep最少的分组数目合

样例1

样例输入1[复制]

1009902020305060708090

样例输出1[复制]

6

限制

各个测试点1s

来源

Noip2007普及组第2题

#include<stdio.h>#define INF 0x3f3f3f3f#include<string.h>#include<algorithm>using namespace std;int num[100000];int main(){int w;scanf("%d",&w);int t;scanf("%d",&t);int i,j;int ans=0;for(i=1;i<=t;i++){scanf("%d",&num[i]);}int wc=t;sort(num+1,num+t+1);for(i=1;i<=t;i++){if(i>wc)break;if(i==wc){ans++;break;}for(j=wc;j>=1;j--){if(num[i]+num[j]<=w){num[j]=INF;ans++;wc--;break;}else{ans++;wc--;}}}printf("%d\n",ans);return 0;} 


0 0
原创粉丝点击