一道有意思的思维题2 --- 排序、枚举

  这道题是又一次在和学弟吃饭的路上听学弟讲的,感觉挺不错的^_^,这样仿佛经常听学弟讲题能收获不少呀,可能明年笔试有望了,哈哈~

  Problem:

    平面上给了有n个人,位置由(x,y)元组给定,平面上还有m扇门,位置由(x,y)给定。现在约定每扇门只能进一个人,且人只能向左和下移动(向x-1和y-1移动),请问最多有多少人进门?

  Solution:

    将人和门按x值从大到小排序,枚举门。对于当前枚举的门i,将值大于door[i].x的所有人的y值放入set中,找到大于等于door[i].y的最小值,将其分配给门i,然后从set中剔除,接着枚举门i+1。

  代码如下:

  

#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
/*
Problem: 平面上给了有n个人,位置由(x,y)元组给定,平面上还有m扇门,位置由(x,y)给定。现在约定每扇门只能进一个人,且人只能向左和下移动(向x-1和y-1移动),请问最多
        有多少人进门?
Solution: 将人和门按x值从大到小排序,枚举门。对于当前枚举的门i,将值大于door[i].x的所有人的y值放入set中,找到大于等于door[i].y的最小值,将其分配给门i,然后从set
        中剔除,接着枚举门i+1。
*/
const int N = 1e3 + 5;
typedef pair<int, int> Tuple;
bool cmp(const Tuple a, const Tuple b) {
    return a.first > b.first;
}

multiset<int> s;
multiset<int>::iterator it;

int main()
{
    int n, m; cin >> n >> m;
    Tuple people[N], door[N];
    for (int i = 0; i < n; i++) {
        cin >> people[i].first >> people[i].second;
    }
    sort(people, people + n, cmp);
    for (int i = 0; i < m; i++) {
        cin >> door[i].first >> door[i].second;
    }
    sort(door, door + m, cmp);

    int ans = 0;
    int k = 0;
    for (int i = 0; i < m; i++) {
        while (k < n) {
            if (people[k].first >= door[i].first) {
                s.insert(people[k].second);
                k++;
            }
        }
        if (s.count(door[i].second) > 0) {
            ans++;
            s.erase(s.find(door[i].second));
        }
        else {
            it = s.upper_bound(door[i].second);
            if (it != s.end()) {
                ans++;
                s.erase(it);
            }
        }
    }
    std::cout << "Answer = " << ans << endl;
    return 0;
}

/*
2 2
5 3
6 5
3 4
4 2
*/

原文地址:https://www.cnblogs.com/chen9510/p/11614030.html

时间: 2024-10-24 15:34:05

一道有意思的思维题2 --- 排序、枚举的相关文章

一道有意思的思维题 --- 排序、枚举

这道题是在与学弟吃饭的路上听学弟讲的,感觉挺有意思的,需要不少的思维(可能我长时间没有刷题了,有点笨了~) 特此记录一下: Problem: 有n个(x,y)元组,求从中取出k个元组,使得这k个元组的x之和乘以其中最小的y值的值最大 ( sum(x)*min(y) in k个元组 ) Solution: 将n个元组按照y值从小到大排序,然后从小到大枚举每个y值,以当前的y值为选取的k个元组中的最小值,那么k个元组位于当前元组之后(一定包含当前元组).也就是说,有k-1个元组还未确定,需要从当前元

记一道有意思的算法题Rotate Image(旋转图像)

题出自https://leetcode.com/problems/rotate-image/ 内容为: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 简单的说就是给出一个n*n的二维数组,然后把这个数组进行90度顺时针旋转,而且不能使用额外的存储空间. 最初拿到这道题

一道有意思的C语言编程题

最近在看经典的C语言入门书籍K&R,虽然是一本入门书籍,可是其中的精妙之处却需要慢慢体会.其中的经典题很多,仔细琢磨一定会收获良多. 今天看到这样一道题:编写一个删除C语言程序中所有的注释语句.感觉颇有意思,与大家一起分享一下: 我的思路: 找到注释的起始符号 \ 判断紧接着的输入字符,如果是*或者是\,则说明后面全是注释,跳过即可,否则照样输出 其他则直接输出 疑问: 所配套的答案书中提出要考虑引号后面的内容以做出响应,不是很明白这是为什么.个人认为无需考虑引号的影响也能将注释去除,希望有高手

思维题 URAL 1718 Rejudge

题目传送门 1 /* 2 题意:数据加10组,再删掉第6组数据,问rejudge后最少最多几个作者收到邮件 3 思维题:当错在6时结果是不一定,错在7时是一定改变,因为会变成6 4 思路没错,但用结构题排序一直WA,代码有毒!学习使用set容器. 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 #include <str

ACM: Gym 101047K Training with Phuket&#39;s larvae - 思维题

Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Practice Description standard input/output Thai cuisine is known for combining seasonings so that every dish has flavors that are s

acm集训训练赛B题【排序+模拟】

一.原题 Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

hdu5325 树的思维题

http://acm.hdu.edu.cn/showproblem.php?pid=5325 Problem Description Bobo has a tree,whose vertices are conveniently labeled by 1,2,...,n.Each node has a weight wi. All the weights are distrinct. A set with m nodes v1,v2,...,vm is a Bobo Set if: - The

codeforces 848B Rooter&#39;s Song 思维题

http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标轴,位置,延迟时间,发生碰撞则交换方向.求最后每个点的射出位置. 首先我们观察能得出两个结论,1. 类似蚂蚁爬树枝的问题,相遇只会交换方向,所以最后的射出点集只会因为碰撞而改变动点与射出点的对应关系,而不会增加减少射出点集.2.我们根据其射入位置和延迟时间可以计算出一个值v=pos-time,只有这