题解
1.题目可以抽象转化为,若干个点和线段,求问最多有多少点和线段能配对,如果点在线段内
2.我们可以采用贪心的方法,对点升序排序,对线段按右端点升序排序
为什么请看下图
code
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,chose;
}cow[2505];
struct node2
{
int x,c;
}sh[2505];
bool cmp1(node a,node b)
{
if(a.r!=b.r) return a.r<b.r;
return a.l<b.l;
}
bool cmp2(node2 a,node2 b)
{
return a.x<b.x;
}
int main()
{
int c,l;
cin>>c>>l;
for(int i=1;i<=c;i++)
{
cin>>cow[i].l>>cow[i].r;
cow[i].chose=0;
}
for(int i=1;i<=l;i++) cin>>sh[i].x>>sh[i].c;
sort(cow+1,cow+1+c,cmp1);
sort(sh+1,sh+1+l,cmp2);
int ans=0;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=c;j++)
{
int x=sh[i].x;
if(cow[j].l<=x&&x<=cow[j].r&&sh[i].c&&!cow[j].chose)
{
cow[j].chose=1;
sh[i].c--;
ans++;
}
if(sh[i].c==0) break;
}
}
cout<<ans;
return 0;
}
标签:node,cow,USACO07NOV,int,线段,Sunscreen,sh,P2887,升序
From: https://www.cnblogs.com/pure4knowledge/p/18101769