这个题被丁神教育了c++调用优先队列的姿势。。。
下面总结一下。。
#include<queue>
priority_queue<xxx,vecrot<xxx>,cmp>
第一个和第二个xxx是当前堆里的数据类型,第三个参量则是一个比较的结构体,和sort里的cmp不同,堆里的cmp要求是一个结构体,而且是默认大根堆,不妨认为越小的越在下面。
cmp的写法
struct rec {int a,b;};
struct cmp
{
bool operator() (rec x,rec y)
{
return x.a<y.a;
}
}//这样写出来的是大根堆!虽然比较符号是小于号。
其他的
priority_queue<int,vector<int>,greater<int> >小根堆注意两个>中间要有空格;
priority_queue<int,vector<int>,less<int> >大根堆;
至于这个题
如果当前任务在其deadline之前完不成的话,就把前面的a最大的工作能往前推一推的推一推。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
struct rec{int a,b,d;double x;} work[100100];
struct cmp1
{
bool operator() (rec x,rec y)
{
return x.a<y.a;
}
};
int cmp2(rec x,rec y)
{
return x.d<y.d;
}
priority_queue <rec,vector<rec>,cmp1>q;
int n;
int main()
{
while (scanf("%d\n",&n)!=EOF)
{
for (int i=1;i<=n;i++)
{
scanf("%d %d %d",&work[i].a,&work[i].b,&work[i].d);
work[i].x=0;
}
sort(work+1,work+n+1,cmp2);
double deadline=0,ans=0;
while (!q.empty()) q.pop();
for (int i=1;i<=n;i++)
{
q.push(work[i]);
deadline+=work[i].b;
while (deadline-work[i].d>1e-9)
{
int x=deadline-work[i].d;
rec tmp=q.top();q.pop();
if (tmp.b-tmp.x-x>1e-9)
{
ans+=(double)x/tmp.a;
tmp.x+=x;
deadline-=x;
q.push(tmp);
}
else
{
ans+=(double)(tmp.b-tmp.x)/tmp.a;
deadline-=tmp.b-tmp.x;
}
}
}
printf("%.2f\n",ans);
}
return 0;
}