题目链接: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; }
时间: 2024-11-06 22:06:57