• 洛谷 P1094 纪念品分组【贪心/双指针/最少多少组合法不要求连续的两两捆绑】


    题目描述

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

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

    输入输出格式

    输入格式:

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

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

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

    第3~n+2行每行包含一个正整数Pi (5 <= Pi <= 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

    【分析】:先升序排序,尽量将最大最小的两个捆绑在一起,设置一前一尾双指针进行移动,直到i>j

    【代码】:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 30000+100;
    int lim,n,a[N],cnt;
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>lim;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        sort(a+1,a+n+1);
        cnt=0;
        int i=1,j=n;
        while(i<=j)
        {
            if(a[i]+a[j]>lim)
            {
                cnt++;
                j--;
            }
            else
            {
                cnt++;
                i++;
                j--;
            }
        }
        cout<<cnt<<endl;
        return 0;
    }
    //20 20 30 50 60 70 80 90 90   //cnt 0+1+1+1+1+1
     //        i     j
    View Code
  • 相关阅读:
    HTTP request smuggling
    Do you really know CSS linear-gradients?
    Populating the page: how browsers work
    船舶智能管理系统API文档
    DocGuarder
    BUC LNB 器件
    BUC 与 LNB 的区别
    EIRP G/T 的意义
    语音的频率、频率分辨率、采样频率、采样点数、量化、增益
    机械波、电磁波的异同
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7920073.html
Copyright © 2020-2023  润新知