D
1.题意:
有C个奶牛去晒太阳(1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。
奶牛涂防晒霜问题,先输入奶牛数C、防晒霜种类L,再输入C头奶牛的防晒指数范围minSPF -- maxSPF,再输入L中防晒霜的防晒指数SPF和瓶数cover。求最多有几头牛可以涂防晒霜。
2.算法思路:
(1)那么将奶牛按照阳光强度的最小值从小到大排序。用结构体储存
将防晒霜也按照能固定的阳光强度从小到大排序。用结构体储存
(2)这里用到了优先队列思想。
从最小的防晒霜枚举,将所有符合 最小值小于等于该防晒霜的 奶牛的 最大值 放入优先队列之中。然后优先队列是小值先出,所以就可以将这些最大值中的最小的取出来。更新答案。
priority_queue
3.代码:
#include
#include
#include
#include
#include
#include
#include
#define Max 2555
using namespace std;
int C, L;
priority_queue
struct Cow //定义奶牛防晒等级结构体
{
int minSPF;
int maxSPF;
}cow[Max];
struct Bottle //定义防晒霜等级结构体
{
int SPF; //防晒霜等级
int cover; //可以给几头奶牛用
}bottle[Max];
int cowAsc(Cow a , Cow b) //奶牛升序函数
{
return a.minSPF < b.minSPF;
}
int botAsc(Bottle a , Bottle b) //防晒霜升序函数
{
return a.SPF < b.SPF;
}
int MaxCNum()
{
int count=0;
int i,j=0; //j忘了赋值
for(i=0;i
{
while(j < C && cow[j].minSPF <= bottle[i].SPF) //将符合防晒霜i的奶牛的maxSPF,进队
{
q.push(cow[j].maxSPF); //每次j不清零,从上次循环的j累计,这样保证遍历一次奶牛样本
j++;
}
while(!q.empty() && bottle[i].cover) //当队列非空,而且防晒霜i有剩余
{
int x = q.top(); //将队头元素出队,即maxSPF最大
q.pop();
if(x < bottle[i].SPF) continue; //如果maxSPF
count++;
bottle[i].cover--; //忘了写--,哎!!!!!!
}
}
return count;
}
int main()
{
int i,count;
scanf("%d %d",&C,&L);
for(i=0 ; i { scanf("%d %d",&cow[i].minSPF,&cow[i].maxSPF); } for(i=0 ; i { scanf("%d %d",&bottle[i].SPF,&bottle[i].cover); } sort(cow,cow+C,cowAsc); //调用排序函数,将奶牛从小到大按照minSPF排列 sort(bottle,bottle+L,botAsc); //调用排序函数,将防晒霜从小到大按照SPF排列 count=MaxCNum(); printf("%d \n",count); // maximum number of cows that can protect themselves return 0; }