码迷,mamicode.com
首页 > 其他好文 > 详细

贪心+容器 hdu4268

时间:2016-08-13 14:11:28      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

Problem Description
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.
 

 

Input
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.
 

 

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

 

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

 

Sample Output
1
2
 

题义大概就是A有一些卡片,B有一些卡片,A的卡片能覆盖B卡片最多多少张(只有长和宽同时大于等于才行)

 

 

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


struct Node{
    int x,y,id;
};
Node G[Maxn*2];

bool cmp(Node n1,Node n2){
    if(n1.x == n2.x && n2.y == n2.y) return n1.id > n2.id;
    //这里注意排序方式
    if(n1.x != n2.x) return n1.x > n2.x;
    return n1.y > n2.y;
}

int main()
{
    int N;
    cin >> N;
    while(N--){
        int n,t;
        cin >> n;
        for(int i = 0; i <(n<<1); i++){
            scanf("%d%d",&G[i].x,&G[i].y);
            if(i < n){
                G[i].id = 1;
            }else{
                G[i].id = 0;
            }
        }
        sort(G,G+(n<<1),cmp);
        multiset<int>s;
        int cnt = 0;
        for(int i = 0; i < (n<<1); i++){
            // 这里用了贪心的方法,因为已经排序了,按照从x从小到大的顺序
            // 如果是A,放入容器,如果是B,就从A中找到比B大的中的最小的(贪心)
            if(G[i].id){
                s.insert(G[i].y);
            }else{
                multiset<int>::iterator it = s.lower_bound(G[i].y);
                if(it == s.end() || *it < G[i].y){ 
                    // 这步判断很重要
                    continue;
                }else{
                    cnt++;
                    s.erase(it);
                    // 找到就删掉,以后都不再用了
                }
            }
        }
        printf("%d\n",cnt);
    }
}

  

 

贪心+容器 hdu4268

标签:

原文地址:http://www.cnblogs.com/yakoazz/p/5767886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!