网站制作一般要几天,免费做代理,shopify与wordpress,制作网页框架的设计工具正题 题目大意 nnn个区间mmm个点#xff0c;一个区间只能匹配一个点#xff0c;求最大匹配数。 解题思路
我们可以先将点排序#xff0c;和区间按照左端点排序。然后从左往右枚举点#xff0c;遇到一个区间的左端点就加入这样我们就可以忽略区间的左端点了#xff0c;然后…正题 题目大意
nnn个区间mmm个点一个区间只能匹配一个点求最大匹配数。 解题思路
我们可以先将点排序和区间按照左端点排序。然后从左往右枚举点遇到一个区间的左端点就加入这样我们就可以忽略区间的左端点了然后遇到右端点就弹出该区间。
然后我们就每次都选出了可以匹配的区间然后在可以匹配的区间中我们选择右端点最靠左的区间匹配。
为什么这是最优的因为在左边的已经不用管了所以在一堆右端点中肯定是更左的是更优的 codecodecode
#includecstdio
#includecstring
#includealgorithm
#includequeue
using namespace std;
const int N200100;
struct node{int l,r;
}a[N];
int n,m,t[N],ans;
priority_queueint q;
bool cmp(node x,node y)
{return x.ly.l?x.ry.r:x.ly.l;}
int main()
{//freopen(dream.in,r,stdin);//freopen(dream.out,w,stdout);scanf(%d%d,n,m);for(int i1;in;i)scanf(%d%d,a[i].l,a[i].r);for(int i1;im;i)scanf(%d,t[i]);sort(t1,t1m);sort(a1,a1n,cmp);int tail1;for(int i1;im;i){while(tailna[tail].lt[i])q.push(-a[tail].r);while(!q.empty()-q.top()t[i]) q.pop();if(!q.empty())ans,q.pop();}printf(%d,ans);
}