題解 P2949 【[USACO09OPEN]工作調度Work Scheduling】
阿新 • • 發佈:2018-10-25
sign using time truct amp priority efi per fin
這道題的思路很神奇,是一種可以後悔的貪心。
解題思路:
我們先將每一個任務按照限制時間排序。
對於每一種任務,我們有兩種抉擇:
for(int i=1;i<=n;++i)
{
if(a[i].d<=q.size())//即是當前這個任務在限制時間內無法完成。
{
//那麽就在前面找到價值比當前的任務小的價值最小的任務,將其替換。
}
else
{
//直接塞入儲存任務的數組
++time_now;
}
}
在上面的思路中,我們需要尋找最小的任務價值,就可以利用優先隊列(小根堆),那麽上面的思路就整理如下:
for(int i=1;i<=n;++i)
{
if(a[i].d<=q.size())
{
if(a[i].p>q.top().p)
{
ans+=a[i].p-q.top().p;
q.pop();
q.push(a[i]);
}
}
else
{
ans+=a[i].p;
q.push(a[i]);
}
}
完整代碼:
#include<cstdio> #include<queue> #include<algorithm> using namespace std; #define int long long struct Work { int d,p; bool operator > (const Work a) const { return p<a.p; } bool operator < (const Work a) const { return p>a.p; } }; Work a[1000005]; bool cmp(Work a,Work b) { return a.d<b.d; } priority_queue <Work> q; int n,ans=0; signed main() { scanf("%lld",&n); for(int i=1;i<=n;++i) { scanf("%lld%lld",&a[i].d,&a[i].p); } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;++i) { if(a[i].d<=q.size()) { if(a[i].p>q.top().p) { ans+=a[i].p-q.top().p; q.pop(); q.push(a[i]); } } else { ans+=a[i].p; q.push(a[i]); } } printf("%lld",ans); return 0; }
題解 P2949 【[USACO09OPEN]工作調度Work Scheduling】