题意:
有n个合同,每个合同的截止日期是di,有个程序员,他完成第i个合同的时间是bi,对于合同i如果给他x元钱,他完成第i个合同的时间就会变成bi-ai*x 。求需要的最少总钱数,使得存在一个方案使得程序员能按时完成所有合同。
分析:
先按di排序,(从小到大)。然后依次完成合同,若发现第i个合同无法在截止日期前完成,便从之前已经完成的任务中选一个aj最大的合同,付钱来使得这个合同尽快完成。
P.S:思路对了,但是下面的代码一直交不过。(T_T) (T_T)
code:
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <iostream> #define MAXN 100005 using namespace std; struct contract { int a, b, d; bool operator < (const contract& t) const { return d<t.d; } } f[MAXN]; struct pq { int a, b; bool operator < (const pq& t) const { return a <t.a; } }; int main() { int n, i, j, Times, t; double ans; priority_queue<pq> q; // freopen("in.txt","r",stdin); scanf("%d",&n); for(i=0; i<n; i++) scanf("%d%d%d",&f[i].a,&f[i].b,&f[i].d); sort(f,f+n); Times = 0; ans = 0.0; for(i=0; i<n; i++) { Times += f[i].b; q.push(pq {f[i].a, f[i].b}); while(Times >f[i].d) { t = Times - f[i].d; pq e = q.top(); q.pop(); if(e.b >=t) { e.b -=t; ans += double(t)/e.a; Times = f[i].d; q.push(e); } else { ans += double(e.b)/e.a; Times -= e.b; e.b = 0; } } } printf("%.2lf\n",ans); return 0; }
AC
#include <iostream> #include <sstream> #include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <climits> #include <cmath> #include <utility> #include <vector> #include <queue> #include <stack> #include <algorithm> #include <set> #include <map> using namespace std; #define pii pair < int , double > #define i64 long long #define CLR(x) memset(x,0,sizeof x) #define SET(x,y) memset(x,y,sizeof x) #define PB(x) push_back(x) #define eps 1e-8 struct job{ int a,b,d; void inp() { scanf("%d %d %d",&a,&b,&d); } }d[100009]; bool comp(job a,job b) { return a.d<b.d; } int main() { int n,i,T; double c,r; cin>>T; while(T--) { cin>>n; for(i=0;i<n;i++) d[i].inp(); sort(d,d+n,comp); r=c=0; priority_queue < pii > q; pii t; for(i=0;i<n;i++) { c+=d[i].b; q.push(pii(d[i].a,d[i].b)); while(c>d[i].d+eps) { t=q.top(); q.pop(); if(c-t.second>=d[i].d) { c-=t.second; r+=t.second/t.first; } else { t.second-=(c-d[i].d); r+=(c-d[i].d)/t.first; c=d[i].d; q.push(t); } } } printf("%.2lf\n",r); } return 0; }