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;
}

猜你喜欢

转载自blog.csdn.net/zhangjianjunab/article/details/79431529
今日推荐