Link:http://acm.hdu.edu.cn/showproblem.php?pid=4268
Alice and Bob
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3933 Accepted Submission(s): 1230
Please pay attention that each card can be used only once and the cards cannot be rotated.
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.
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
AC code:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<vector>
#include<set>
#define LL long long
#define MAXN 1000010
using namespace std;
const int N=20;
struct node{
int h;
int w;
bool operator < (const node &b)const
{
if(h!=b.h)
return h<b.h;
else
return w<b.w;
}
}card1[MAXN],card2[MAXN];
int ans;
multiset<int>sett;
multiset<int>::iterator it;
int main()
{
// freopen("D:\\in.txt","r",stdin);
int T,i,j,jj,n;
scanf("%d",&T);
while(T--)
{
sett.clear();
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&card1[i].h,&card1[i].w);
}
for(i=1;i<=n;i++)
{
scanf("%d%d",&card2[i].h,&card2[i].w);
}
sort(card1+1,card1+n+1);
sort(card2+1,card2+n+1);
j=1;
ans=0;
for(i=1;i<=n;i++)
{
while(j<=n&&card1[i].h>=card2[j].h)//找出满足第一维的所有元素
{
sett.insert(card2[j].w);//放入集合里面
j++;
}
if(sett.empty())
continue;
it=sett.lower_bound(card1[i].w);//lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置
if(*it==card1[i].w)//查找的第二维元素满足且最接近(贪心思想:“最接近”在这里的意思是尽可能大的意思)
{
ans++;
sett.erase(it);
}
else//查找的第二维元素不满足,往前找元素
{
if(it==sett.begin()) continue;
else
{
sett.erase(--it);//找第二维满足的且尽可能大的
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
286



被折叠的 条评论
为什么被折叠?



