UVALive 4254 Processor(二分)
生活随笔
收集整理的這篇文章主要介紹了
UVALive 4254 Processor(二分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很容易想到二分,問題在與判斷一個解的可行性。貪心,時間點最多兩萬,可以模擬每個時間點,將事件按開始時間排序,
每次優先選已經開始了的且結束時間最早的任務來做,如果某個任務在deadline之前還沒有結束說明當前解不可行。
R的上界不太好估計,(遠遠達不到總和,但是比maxw大,因為任務在時間上有重疊),稍微取大點。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e4+5; struct Job {int r,d,w;bool operator < (const Job &rh) const {return d > rh.d;//return r < rh.r || ( r == rh.r && d < rh.d); }void IN(){scanf("%d%d%d",&r,&d,&w);} }J[maxn];bool cmp(const Job&a, const Job&b) { return a.r < b.r; } const int maxd = 2e4; int n; bool ok(int m) {priority_queue<Job> q;for(int i = 2,j = 0; i <= maxd; i++){while(j < n && J[j].r < i) q.push(J[j++]);int W = m;while(W>0 && q.size()){Job cur = q.top(); q.pop();if(cur.w <= W){W-=cur.w;}else {if(cur.d <= i ) return false;cur.w -= W;q.push(cur);W = 0;}}if(j == n && q.empty()) return true;}return false; }int main() {//freopen("in.txt","r",stdin);int T; scanf("%d",&T);while(T--){scanf("%d",&n);for(int i = 0; i < n; i++) J[i].IN();sort(J,J+n,cmp);int L = 1, R = 1e4,M;for(; L<R ; ok(M)?R=M:L=M+1 ) M = (L+R)>>1;printf("%d\n",L);}return 0; }?
轉載于:https://www.cnblogs.com/jerryRey/p/4809980.html
總結
以上是生活随笔為你收集整理的UVALive 4254 Processor(二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Unity3D技巧】一个简单的Unit
- 下一篇: Android官方文章翻译之管理设备苏醒