poj 2970 The lazy programmer 优先队列

题目链接:http://poj.org/problem?id=2970

 

先按deadline升序排

然后一件事一件事处理

这里需要【维护】已经过去的事情和当前这件事情中a值最大的项 这里就用到优先队列

时间不够的 就通过增大前面及当前的某件事的x值来补

 

这题卡精度

原来那种姿势不知道怎么就wa了

辛苦改成这种姿势以后

一开始在sum那里是整型过不了

然后改成double就过了

究其原因 应该也是【类型转换没有四舍五入】 导致精度损失

以后在除的地方 除了记得强制类型转换 还得考虑精度的问题 

 

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <set>
#include <queue>
#include <vector>

using namespace std;

typedef long long ll;

const int maxn = 110000;
const double eps = 1e-7;

struct Node
{
    int a, b, d;
    double x;
    bool operator < (const Node& x) const
    {
        return a < x.a;
    }
}e[maxn];

bool cmp(const Node x, const Node y)
{
    return x.d < y.d;
}

priority_queue<Node> que;

int main()
{
    //freopen("in.txt", "r", stdin);

    int n;
    while(scanf("%d", &n) == 1)
    {
        for(int i = 1; i <= n; i++)
        {
            scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].d);
            e[i].x = 0;
        }
        e[0].d = 0;

        sort(e + 1, e + n + 1, cmp);

        double ans = 0;
        double sum = 0;
        for(int i = 1; i <= n; i++)
        {
            que.push(e[i]);
            sum += e[i].b;
            if(sum > e[i].d)
            {
                //int tmp = sum - e[i].d;//需要减掉的时间
                while(sum > e[i].d)
                {
                    Node cur = que.top();
                    que.pop();
                    double z = (double)(sum - e[i].d) / cur.a;
                    if((double)cur.b/cur.a - cur.x > z)
                    {
                        cur.x += z;
                        ans += z;
                        sum -= z*cur.a;
                        que.push(cur);
                    }
                    else
                    {
                        z = (double)cur.b/cur.a - cur.x;
                        sum -= z*cur.a;
                        ans += z;
                        cur.x += z;
                    }
                }
            }
        }

        while(!que.empty())
            que.pop();

        printf("%.2f\n", ans);
    }

    return 0;
}

 

posted @ 2015-02-26 23:11  地鼠地鼠  阅读(404)  评论(0编辑  收藏  举报