您的位置:首页 > 其它

POJ 2970 The lazy programmer 优先队列

2014-01-06 00:53 453 查看
--------------

const double EPS = 1e-7;
const int maxn=150000;

int dcmp(double a,double b){
if (abs(a-b)<EPS) return 0;
if (a>b) return 1;
else return -1;
}
struct Dat{
int a,b,d;
double c;
bool operator<(const Dat& rhs)const{
return a<rhs.a;
}
Dat(){c=0;}
Dat(int x,int y,int z){
a=x;b=y;d=z;c=0;
}
};
bool cmp(const Dat& a,const Dat& b){
return a.d<b.d;
}
priority_queue<Dat>que;

int n;

Dat a[maxn];

int main(){
while (~scanf("%d",&n)){
while (!que.empty()) que.pop();
for (int i=0;i<n;i++){
scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].d);
a[i].c=0;
}
sort(a,a+n,cmp);
double sum=0;
double T=0;
for (int i=0;i<n;i++){
que.push(a[i]);
T+=(double)a[i].b;
while (dcmp(T,(double)a[i].d)>0){
Dat pr=que.top();
que.pop();
double x=(T-(double)a[i].d)/(double)pr.a;
if (dcmp((double)pr.b/(double)pr.a,pr.c+x)>0){
pr.c+=x;
sum+=x;
T-=x*(double)pr.a;
que.push(pr);
break;
}
else {
x=(double)pr.b/(double)pr.a-pr.c;
pr.c+=x;
sum+=x;
T-=x*(double)pr.a;
}
}
}
printf("%0.2f\n",sum);
}
return 0;
}


--------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: