• 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
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    dockerfile 踩坑记录
    Windows安装配置xampp
    docker 容器中设置 mysql lampp php软链接
    linux 软件连接 创建/查看/删除
    mysql 远程连接权限
    linux设置静态获取ip
    android 自定义控件中获取属性的三种方式(转)
    android 自定义组件-带图片的textView
    CodeIgniter 3之Session类库(3)(转)
    CodeIgniter 3之Session类库(2)(转)
  • 原文地址:https://www.cnblogs.com/dishu/p/4302382.html
Copyright © 2020-2023  润新知