zoukankan      html  css  js  c++  java
  • 洛谷 1094——纪念品分组(贪心)

    题目描述

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

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

    输入输出格式

    输入格式:
    输入文件group.in包含n+2行:

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

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

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

    输出格式:
    输出文件group.out仅一行,包含一个整数,即最少的分组数目。

    输入输出样例

    输入样例#1:
    100
    9
    90
    20
    20
    30
    50
    60
    70
    80
    90
    输出样例#1:
    6
    说明

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

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


    从小到大快排
    然后设一个头指针l,和尾指针r。
    如果a[l]+a[r]小于等于m,则组数加一,l+1,r-1。
    如果a[l]+a[r]大于m,则组数加一,r-1


    代码如下:

    var  n,m,i,j,ans,l,r,t:longint;
         a:array[1..30000]of longint;
    
    procedure qsort(l,r:longint);
    var
      i,j:longint;
      temp,key:qword;
    begin
      if l>=r then exit;
      i:=l;j:=r;
      key:=a[l+random(r-l+1)];
      repeat
        while (a[i]<key) do inc(i);
        while (a[j]>key) do dec(j);
        if i<=j then
          begin
            temp:=a[i];a[i]:=a[j];a[j]:=temp;
            inc(i);dec(j);
          end;
      until i>j;
      qsort(l,j);
      qsort(i,r);
    end;
    
    begin
      readln(m);
      readln(n);
      for i:=1 to n do read(a[i]);
      qsort(1,n);
      l:=1;
      r:=n;
      while l<=r do
        if a[l]+a[r]<=m then
          begin
            inc(ans);
            inc(l);
            dec(r);
          end
        else
          begin
            inc(ans);
            dec(r);
          end;
      write(ans);
    end.
  • 相关阅读:
    矩阵
    手机APP和WAP版的区别
    学习的方法
    ASP.Net中jQuery控制div弹出框效果
    SQL SERVER字符串前加N转换为Unicode编码
    塞尔维亚国家简称编码
    VS2019项目模板中没有[ASP.NET空网站]的解决方案
    Scopus论文数据爬虫
    采集科研文献和数据,我告诉你一个能自动采集的黑科技
    CiteSpace入门教程
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412414.html
Copyright © 2011-2022 走看看