HDUoj 4268 Alice and Bob ( STL二分贪心

解决一个游戏中的数学问题,即如何用一组矩形卡片尽可能多地覆盖另一组较小的矩形卡片。采用贪心算法,首先对所有卡片按宽度排序,然后使用二分查找法来确定每个较大卡片可以覆盖的较小卡片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Alice and Bob’s game never ends. Today, they introduce a new game. In this game, both of them have N different rectangular cards respectively. Alice wants to use his cards to cover Bob’s. The card A can cover the card B if the height of A is not smaller than B and the width of A is not smaller than B. As the best programmer, you are asked to compute the maximal number of Bob’s cards that Alice can cover.
Please pay attention that each card can be used only once and the cards cannot be rotated.

输入

The first line of the input is a number T (T <= 40) which means the number of test cases.
For each case, the first line is a number N which means the number of cards that Alice and Bob have respectively. Each of the following N (N <= 100,000) lines contains two integers h (h <= 1,000,000,000) and w (w <= 1,000,000,000) which means the height and width of Alice’s card, then the following N lines means that of Bob’s.

输出

For each test case, output an answer using one line which contains just one number.

样例

2
2
1 2
3 4
2 3
4 5
3
2 3
5 7
6 8
4 1
2 5
3 4 
1
2

题意

给两组 矩形 让我们查找 第一矩形最多有几个比第二组大?

明显的贪心 先将矩形按长x升序排列 然后每次 查找 符合A[i].x>B[j].x 条件的 B组矩形 扔进multiset里面
multiset里面每次进行二分查找比 A[i].y 大的数 找到了在集合中删去 计数++

AC代码

#include<bits/stdc++.h>
using namespace std;

#define LL long long
#define CLR(a,b) memset(a,(b),sizeof(a))

const int MAXN = 1e5+111;
multiset<int> mst;
multiset<int>::iterator it;
struct node
{
    int x, y;
    friend bool operator < (node a, node b) {
        return a.x < b.x;
    }
}A[MAXN],B[MAXN];
int main()
{
    ios::sync_with_stdio(false);
    int n, T;
    cin >> T;
    while(T--) {
        mst.clear();
        cin >> n;
        for(int i = 0; i < n; i++) cin >> A[i].x >> A[i].y;
        for(int i = 0; i < n; i++) cin >> B[i].x >> B[i].y;
        sort(A, A+n);
        sort(B, B+n);
        int k = 0;
        for(int i = 0,j = 0; i < n; i++) {
            while(j<n && A[i].x >= B[j].x) mst.insert(B[j++].y);
            if(mst.empty()) continue;
            it = mst.upper_bound(A[i].y);
            if(it != mst.begin()) {
                it--;
                mst.erase(it);
                k++;
            }

        }
        cout << k << endl;
    }


return 0;
}
请提供几个符合以下范围的蓝桥杯STEMA试题 • 基本概念与结构:程序设计语言以及程序编译和运行的基本概念,头文件、命名空间、主函数;• 数据类型与变量:整型(int,long long)、布尔型(bool)、字符型(char)、实型(float,double)、变量和常量的定义与使用、基本数据类型转换;• 运算:赋值运算、算术运算、逻辑运算、关系运算、位运算;• 控制结构:顺序结构、分支结构、循环结构、流程图;• 数组:一维数组、二维数组及多维数组;• 字符与字符串:字符数组、字符串类、字符串常用函数及 ASCII 编码;• 指针:定义及使用;• 函数:定义和使用,变量的作用域,常用的库函数;• 结构体:结构体的定义、存储,结构体数组的定义、存储、遍历等;• 类与对象:定义和使用,构造函数,析构函数;• 进制及进制转换;• 初等数论:整除、因数、倍数、指数、质 ( 素 ) 数、合数等概念,判断质数、合数、约数方法,辗转相除法(欧几里得算法)求最大公约数,埃氏筛与线性筛筛质数,同余定理、加乘原理、排列组合;• 算法:o 入门算法:枚举法、模拟法;o 排序算法:冒泡排序、选择排序、插入排序、计数排序;o 基础算法:贪心法、递推法、递归法、二分法;o 数值处理算法:高精度加法、高精度减法、高精度乘法、高精度除法;o 搜索算法:深度优先算法、广度优先算法;o 动态规划:一维动态规划、背包类型动态规划;o (通常仅限中高级考试)动态规划:区间类型动态规划、树型动态规划;• 数据结构:o 线性数据结构:单链表、双向链表、循环链表、栈、队列;o 树:二叉树、完全二叉树、满二叉树、哈夫曼树、二叉搜索树;o STL:vector、list、stack、queue、set、map 以及常用函数;o (通常仅限中高级考试)图:邻接矩阵、邻接表、深度优先遍历、广度优先遍历、泛洪算法。
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值