Luogu P1094 纪念品分组

Description

详见https://www.luogu.org/problem/show?pid=1094

Solution

> -------
这是一道不错的贪心,虽然代码很短,但是证明还是挺考思维的
> -------
先从大到小排序
> -------

刚开始想将最大的和他能搭配的最大的搭配,比如图中a可以和c和d,但是我想选择c,


> -------
但是仔细一想其实没这个必要,
因为 ,如果a>b,c>d  而且 a+c<=w 那么b+c<=w  也就是说无论 a&c,b&d 或a&d,b&c都是两种


于是我们的搭配完全没有必要交叉,交叉的结果也是等于不交叉的
> -------
所以我们可以从外向内匹配【保证不交叉】
如果可以匹配就匹配不能就自己放一个盒子

Codes

 1 var
 2   n,w,i,j,ans:Longint;
 3   a:array[1..30000] of longint;
 4   b:array[1..30000] of Boolean;
 5
 6 procedure qsort(l,r: longint);
 7 var
 8    i,j,x: longint;
 9    y:longint;
10 begin
11     i:=l;   j:=r;
12     x:=a[(l+r) div 2];
13    repeat
14      while (a[i]>x)  do inc(i);
15      while  (x>a[j]) do dec(j);
16      if not(i>j) then
17        begin
18          y:=a[i];  a[i]:=a[j];   a[j]:=y;
19          inc(i);   j:=j-1;
20        end;
21    until i>j;
22    if l<j then qsort(l,j);
23    if i<r then qsort(i,r);
24 end;
25
26 begin
27    // assign(input,‘t.in‘);  assign(output,‘t.out‘);
28     reset(input);  rewrite(output);
29
30     readln(w);
31     readln(n);
32     for i:= 1 to n do readln(a[i]);
33
34     qsort(1,n);
35
36     i:=1;  j:=n;
37     while i<=j do
38     begin
39         if a[i]+a[j]<=w then dec(j) ;
40         inc(i);
41         ans:=ans+1;
42     end;
43
44     writeln(ans);
45     close(input); close(output);
46 end.
时间: 2024-11-09 10:47:25

Luogu P1094 纪念品分组的相关文章

luogu tyvj 纪念品分组

纪念品分组 描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. [限制] 50%的数据满足: 1 <=n <= 15 100%的数据满足: 1 <= n <= 30

洛谷 P1094 纪念品分组【贪心/双指针】

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入输出格式 输入格式: 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上上限. 第

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

noip普及组2007 纪念品分组

纪念品分组 描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. [限制] 50%的数据满足: 1 <=n <= 15 100%的数据满足: 1 <= n <= 30

【贪心】纪念品分组(P1094)

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入输出格式 输入格式: 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上上限. 第

纪念品分组

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入输出格式 输入格式: 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上上限. 第

2007纪念品分组

题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入描述 Input Description 包含n+2行: 第1行包括一个整数w,为每组纪念品价格之

纪念品分组 2007年NOIP全国联赛普及组

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入输出格式 输入描述: 包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上限. 第2行为一个整数n,表示购来的纪

NOIP200702【纪念品分组】

[试题描述] 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少.你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. [输入示例] 1009     90     20     20     30     50     60     70