匹配星星
题目描述
天上有n颗星星,每颗星星有二维坐标(xi, yi)还有一个属性值zi,若两颗星星A, B满足xA<xB且yA<yB且zA<zB,则这两颗星星可以配成一对,每颗星星最多只能在一对之中,求最多能配成多少对星星。
输入描述:
第一行一个正整数 n ,表示星星的个数。
接下来 n 行,每行 3 个整数xi,yi,zi ,表示一颗星星。
输出描述:
一行一个整数,表示答案。
贪心的证明永远都是一个难题,很多时候都是通过直接交题,通过wa来检查;
这道题的贪心也不是那么好想,更别说证明了;
#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
//ios::sync_with_stdio(false);
using namespace std;
const int N=100100;
const int M=200100;
const ll mod=998244353;
struct Node{
int x,y,z;
}xin[N];
bool cmp(Node p,Node q){
if(p.x==q.x) return p.z<q.z;
return p.x<q.x;
}
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>xin[i].x>>xin[i].y>>xin[i].z;
sort(xin+1,xin+n+1,cmp);
multiset<int>se;
multiset<int>::iterator it;
int ans=0;
for(int i=1;i<=n;i++){
if(xin[i].z){
it=se.lower_bound(xin[i].y);
if(it!=se.begin()){
it--;
ans++;
se.erase(it);
}
}
else se.insert(xin[i].y);
}
cout<<ans<<endl;
return 0;
}