• 洛谷 P1094: 纪念品分组


    https://www.luogu.org/problemnew/show/P1094

    题目描述

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

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

    输入输出格式

    输入格式:

    共n+2n+2n+2行:

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

    第222行为一个整数nnn,表示购来的纪念品的总件数GGG。

    第333至n+2n+2n+2行每行包含一个正整数Pi(5≤Pi≤w)P_i(5 le P_i le w)Pi​(5≤Pi​≤w)表示所对应纪念品的价格。

    输出格式:

    一个整数,即最少的分组数目。

    输入输出样例

    输入样例#1: 复制

    100 
    9 
    90 
    20 
    20 
    30 
    50 
    60 
    70 
    80 
    90
    

    输出样例#1: 复制

    6
    

    说明

    50%的数据满足:1≤n≤151 le n le 151≤n≤15

    100%的数据满足:1≤n≤30000,80≤w≤2001 le n le 30000,80 le w le 2001≤n≤30000,80≤w≤200

    选择最小的与最大的分为一组,如果大于上限,大的那个数找不到更小的数组合,只能单独一个分组。

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    #define N 30020
    int a[N];
    int main()
    {
        int i,n,m,j,ans=0;
        scanf("%d%d",&m,&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        i=0;j=n-1;
        while(i<j)
        {
            if(a[i]+a[j]<=m)
            {
                ans++;
                i++;
                j--;
            }
            else
            {
                j--;
                ans++;
            }
        }
        if(i==j)
            ans++;
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    URL记录
    Mongodb集群节点故障恢复场景分析(转)
    IO 和 NIO 的区别
    VUE 前端项目优化方法
    缓存的穿透和雪崩
    接口如何处理重复请求?
    线程池构造类 ThreadPoolExecutor 的 5 个参数
    大型网站在架构上应当考虑哪些问题
    synchronized 和 lock 的区别
    JVM虚拟机 YGC和FGC发生的具体场景
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10002976.html
Copyright © 2020-2023  润新知