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+n-ni);

    return  0;

}

 

 

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

 

posted @ 2018-11-23 13:47  敌敌畏58  阅读(167)  评论(0编辑  收藏  举报