日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU-6180 Schedule

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU-6180 Schedule 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

給n個工作的開始時間和結束時間 每個工作需要用機器來完成 讓我們給這n個工作規劃機器 規劃出盡可能少機器數目 以及計算最少的機器時間(機器時間為機器使用的最終結束時間減去開始時間)

分析
這道題其實就是一個工作的開始結束形成了一個線段 讓我們求多個線段不交叉不重疊拼接拼到一個方向上 拼合后 求最終剩下的線段方案數 和工作時間

所以這道題可以看出一個性質 那就是每次拍工作時 時根據上一個工作的結束時間 然后再在后面的工作開始時間里選擇一個最近的 排上去
如果剩下的工作開始時間都比當前機器的結束時間小 那么就重新開新的機器
我們可以從頭開始枚舉點 如果這個點的開始時間在所有機器的結束時間里能找到個最近的結束時間 表示可以續上 那么我們就把這個工作的結束時間代替那個機器的結束時間 那么如何保證能找到那個點呢?
我們就需要對開始時間排序 保證當前處理的點 比他早開始的一定處理過了 盡可能地讓當前點的開始時間可以接上前面結束的工作
*所以得到思路
用set維護機器個數
set中的值表示開的機器個數
每次遍歷新規劃時 就是取這個規劃的開始點 看能否插在其中 如果可以就用新的結束點代替可以
插入位置的結束點
set中存的是每個規劃的終點 表示這個規劃目前機器的結束時間 如果可以繼續插入表示可以代替
上次的結束時間 更新為新的結束時間
注意對于每一個新點 我們對這個點的開始時間二分 有兩種情況
1 這個點能找到插入位置也就是有插入下界 那么范圍會是第一個元素到最后一個元素
2 這個點找不到插入位置 那么會返回begin() 表示這個時候要開新機器
最后 set中的數量就是機器的個數
過程中可以計算間隔
插入就直接計算 上一個和當前點的終點之差 新點 直接計算差值*

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 100010; struct node{int l,r; }N[maxn]; bool cmp(node a,node b){return a.l<b.l||(a.l==b.l&&a.r<b.r); } multiset<int>ms; multiset<int>::iterator it; int main() {int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&N[i].l,&N[i].r);sort(N+1,N+1+n,cmp);ll ans=0;for(int i=1;i<=n;i++){it = ms.upper_bound(N[i].l);if(it==ms.begin()){ans+=N[i].r-N[i].l;ms.insert(N[i].r);}else{it--;ans+=N[i].r-(*it);ms.insert(N[i].r);ms.erase(it);}}printf("%d %lld\n",ms.size(),ans);ms.clear();}return 0; }

總結

以上是生活随笔為你收集整理的HDU-6180 Schedule的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。