zoukankan      html  css  js  c++  java
  • caioj:1682: 【贪心】买一送一

    题目描述

    【题意】
        CH最近在网上发现干草买一送一的一笔交易,他每买一捆尺寸为A的干草,就可以免费获赠一捆尺寸为 B (1 ≤ B < A)的干草,注意B < A。
        然而,这个买卖是有限制的:需要花钱的干草都是高质量的,而免费赠送的都是次品。然而节俭的CH并不在意质量:为了省钱他会买任意质量的干草。
        给出N捆高质量的干草,以及M捆次品干草,找出CH最多可以买到多少捆干草。他可以单独买高质量的干草而没有获赠免费的次品干草;但是他不能单独买次品干草。

    【输入描述】
        第1行: 两个用空格隔开的整数:N和M。
        第2行到第N+1行:每行一个整数,表示一捆高质量干草的尺寸。
        第N+2行到第N+M+1行:每行一个整数,表示一捆次品干草的尺寸。

    【输出描述】
        唯一一行:一个整数,表示CH可以买到干草的最大捆数。

    【样例输入】
    3 4
    6
    1
    3
    1
    5
    3
    4

    【样例输出】
    5

    【提示】
        样例说明:
        共有3捆高质量的干草,尺寸分别是6,1,和3; 共有4捆次品干草,尺寸分别是1,5,3,和4。
        显然,FJ可以买到所有高质量的干草。当他买尺寸为6的高质量干草时,他可以获赠尺寸为3的次品。当他买尺寸为3的高质量干草时,他可以获赠尺寸为1的次品。然而,当他买质量为1的高质量干草时,无论如何,他都不可能再获赠次品干草。所以答案就是3+2=5。
    1 ≤ A ≤ 1,000,000
    1 ≤ N ≤ 10,000
    1 ≤ M ≤ 10,000

    题解:

      这道题十分水,首先高级稻草我们可以全部买齐,每个低级稻草都要配对一个离它最近且比他大的稻草才不会浪费,最后加上能派对上高级稻草的低级稻草的个数

    代码(建议自己打):

    #include<cstdio>

    #include<cstring>

    #include<algorithm>

    using  namespace  std;

    int  a[21000],b[21000],n,m;

    int  main()

    {

        scanf("%d%d",&n,&m);

        for(int  i=1;i<=n;i++)scanf("%d",&a[i]);

        for(int  i=1;i<=m;i++)scanf("%d",&b[i]);

        sort(a+1,a+n+1);

        sort(b+1,b+m+1);

        int  ni=n;//ni表示没配对低级稻草的个数

        for(int  i=m;i>=1;i--)

        {

            if(ni==0)break;

            if(b[i]<a[ni])ni--;//如果这颗高级稻草配对了一枚低级稻草,那么把他踢出为匹配队列

        }

        printf("%d ",n+n-ni);

        return  0;

    }

    注:上面的图片侵权抱歉!

  • 相关阅读:
    (CSDN 迁移) jFinal找不到或无法加载主类
    (CSDN迁移) jFinal无法启动_JFinalDemoGenerator问题解决办法
    (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)
    (CSDN迁移)JAVA多线程实现-单线程化线程池newSingleThreadExecutor
    (CSDN迁移) JAVA多线程实现-实现Runnable接口
    (CSDN迁移)JAVA多线程实现-继承Thread
    (CSDN迁移) html中的rel属性
    通过microtask和macrotask理解Vue.nextTick()的实现
    javascript处理异步的三种方法
    git常用的基本命令
  • 原文地址:https://www.cnblogs.com/zhangjianjunab/p/10007075.html
Copyright © 2011-2022 走看看