最佳工厂
湫湫系列故事——消灭兔子
对于这两道题需要使用贪心+优先队列的方法来做。
首先介绍一下优先队列:优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素
每个元素的优先级根据问题的要求而定。当从优先级队列中删除一个元素时,可能出现多个元素具有相同的优先权。在这种情况下,把这些具有相同优先权的元素视为一个先来先服务的队列,按他们的入队顺序进行先后处理。
优先队列的声明:
priority_queue<结构类型> 队列名;
如果默认的话,是less排序。
优先队列使用方法:
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
q.back();//返回q的末尾元素
如果对于队列里元素是一个结构体类型,按照某一个属性排序,就需要对比较函数进行重载,定义优先级的时候,直接在类中写个friend 的操作符重载函数即可:
struct node
{
int d;
int p;
friend bool operator < (node x,node y)
{
return x.p>y.p;
}
};
这个就是重载了小于号
return x.p>y.p;
这行代码表示如果使用优先队列。则会按p从小到大排序,p值小的在队头
湫湫系列故事——消灭兔子
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int d;//伤害
int p;//价钱
friend bool operator < (node x,node y)
{
return x.p>y.p;//价钱低的在队头
}
};
int cmp(int x,int y)
{
return x>y;
}
int cmp0(node x,node y)
{
return x.d>y.d;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
int blood[100005];
int flag[100005];
node s[100005];
memset(flag,0,sizeof(flag));
memset(blood,0,sizeof(blood));
memset(s,0,sizeof(s));
for(int i=0;i<n;i++)//兔子血量
{
cin>>blood[i];
}
for(int i=0;i<m;i++)//伤害
{
cin>>s[i].d;
}
for(int i=0;i<m;i++)//价钱
{
cin>>s[i].p;
}
sort(blood,blood+n,cmp);//兔子血量递减排序
sort(s,s+m,cmp0);//箭的伤害递减排序
priority_queue <node> q;
node temp;
long long sum=0;
int f=1; //标记有兔子无法消灭
int t=0;//作为箭的下标入队
if(m<n)
{
cout<<"No"<<endl;
}else
{
for(int i=0;i<n;i++)
{
while(t<m&&s[t].d>=blood[i])
{
q.push(s[t]);
t++;
}
if(q.empty())
{
f=0;
break;
}else
{
temp=q.top();
sum+=temp.p;
q.pop();
}
}
if(f)
{
cout<<sum<<endl;
}else
{
cout<<"No"<<endl;
}
}
}
return 0;
}
最佳工厂
代码:
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct arr{
int w;//重量
int t;//时间
friend bool operator <(arr q,arr e)
{
return q.w<e.w;//重量大的优先出队
}
}a[1001],uu;
int cmp(arr x,arr y)
{
return x.t<y.t;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>a[i].w>>a[i].t;
}
sort(a,a+n,cmp);//按时间升序
int sumt=0;
int weight=0;//记录总质量
priority_queue<arr>s;
for(int i=0;i<n;i++)
{
weight+=a[i].w;
s.push(a[i]);
if(weight>a[i].t)
{
while(!s.empty()&&weight>a[i].t)
{
uu=s.top();
s.pop();
weight-=uu.w;
}
}
}
cout<<s.size()<<endl;
}
return 0;
}