POJ 2970 The lazy programmer 【贪心+堆】
【题意】就是有n件工作,每件工作有一个期限d,一个预计完成需要的时间 b,还有一个a (如果你给这个人x元,那么他完成这件工作的时间就变为b - a * x。题目所求是问你最少需要多少时间,便可以保证所有工作都在其期限之前完成。
【题解】
我们肯定是按照d从小到大考虑,每次如果能在期限之前完成就不用花钱,很明显如果不能,我们从前面完成的任务中选出一个a最大的(当x相同时,能够省下更多时间)来花钱减时间即可。用堆维护最大最小值。
POJ上不能用“%lf”,要用“%f”,真是坑QAQ
# include <stdio.h> # include <queue> # include <algorithm> using namespace std; struct node { int a, b, d; double cost; node() {cost=0;} friend bool operator <(node A, node B) { return A.a<B.a; } } p[100100]; int n; const double eps = 1e-9, meps = -eps; inline bool cmp(node a, node b) { return a.d<b.d; } priority_queue<node> q; inline bool bzero(double x) { return x > eps; } int main() { scanf("%d", &n); for (int i=1; i<=n; ++i) { scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].d); p[i].cost=0; } sort(p+1, p+n+1, cmp); while(!q.empty()) q.pop(); double cur=0, ans=0; for (int i=1; i<=n; ++i) { q.push(p[i]); cur += p[i].b; while(bzero(cur - p[i].d)) { node t = q.top(); q.pop(); double x = (cur - p[i].d) / t.a; if(bzero((double)t.b / t.a - t.cost - x)) { t.cost += x; ans += x; cur -= x*t.a; q.push(t); break; } else { x = (double)t.b/t.a - t.cost; t.cost += x; ans += x; cur -= x*t.a; } } } printf("%.2f\n", ans); return 0; }
2023年5月17日 19:12
The name 'TeachersBadi' reveals the nature of the site. A dedicated Team for teachers, students, and educators is launching and running the site. We enjoy sharing primarily educational material and employee teachersbadi.in and teacher-related content in the educational area. TeachersBadi is a website dedicated to education, students, and teachers.