我想说 本来这道题我会做的,可是可是=-=。。。
题目大意是在沙滩上给c头奶牛涂防晒霜,它们只能承受一定范围的阳光,大于minspf,小于maxspf,但只有L种防晒霜,每瓶标有可以到达的阳光值和量数,求问最多可以保护多少只奶牛
用优先队列吧,再加贪心算法将满足条件的maxspf加入优先队列,然后选取最小的;
<p>#include <stdio.h>
#include <algorithm>
#define M 3000
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
priority_queue<int , vector <int>, greater<int> >q;
typedef pair <int,int >p;
p cow[M],bot[M];</p><p>int v[M];</p><p>
int main()
{
freopen("in.txt","r",stdin);
int c,l;
scanf("%d%d",&c,&l);
memset(v,0,sizeof v);
for(int i=0;i<c;i++)
{
scanf("%d%d",&cow[i].first,&cow[i].second);</p><p> }
for(int j=0;j<l;j++)
{
scanf("%d%d",&bot[j].first,&bot[j].second);</p><p> }
sort(bot,bot+l);
int ans=0;
int j;
for(int i=0;i<l;i++)
{
j=0;
while(j<c&&cow[j].first<=bot[i].first)
{
if(v[j])
continue;
q.push(cow[j].second);
v[j]=1;
j++;
}
while(!q.empty()&&bot[i].second)
{
int x=q.top();
q.pop();
if(x<bot[i].first)
continue;
ans++;
bot[i].second--;
}
}</p><p>printf("%d\n",ans);
return 0;
}</p>
其实我知道我是优先队列不会用的缘故,懂了几点技巧。
priority_queue<int , vector <int>, greater<int> >q;
这表示升序排列,先出小的。本来默认是降序的,先出大的。
还有一点就是sort的用法
对结构体排序
默认是先排前面的参数。也可以自定义。
bool comparison(example a,example b){ return a.elem1>b.elem1;}
sort(array.begin(),array.end(),comparison);//从大到小排
就是这样了