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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj 2109: [Noi2010]Plane 航空管制

發布時間:2025/5/22 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 2109: [Noi2010]Plane 航空管制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

世博期間,上海的航空客運量大大超過了平時,隨之而來的航空管制也頻頻 發生。最近,小X就因為航空管制,連續兩次在機場被延誤超過了兩小時。對此, 小X表示很不滿意。 在這次來煙臺的路上,小 X不幸又一次碰上了航空管制。于是小 X開始思考 關于航空管制的問題。 假設目前被延誤航班共有 n個,編號為 1至n。機場只有一條起飛跑道,所 有的航班需按某個順序依次起飛(稱這個順序為起飛序列)。定義一個航班的起 飛序號為該航班在起飛序列中的位置,即是第幾個起飛的航班。 起飛序列還存在兩類限制條件: ? 第一類(最晚起飛時間限制):編號為 i的航班起飛序號不得超過 ki; ? 第二類(相對起飛順序限制):存在一些相對起飛順序限制(a, b),表示 航班 a的起飛時間必須早于航班 b,即航班 a的起飛序號必須小于航班 b 的起飛序號。 小X 思考的第一個問題是,若給定以上兩類限制條件,是否可以計算出一個 可行的起飛序列。第二個問題則是,在考慮兩類限制條件的情況下,如何求出每 個航班在所有可行的起飛序列中的最小起飛序號。

solution

第一問是菜肴制作,建反圖貪心即可.
第二問我們單獨考慮每個飛機,我們強行不管這個飛機,按第一問的做法,拓撲排序,直到隊列空或者出現不能編號的情況為止,這個時候編號能夠比它大的能處理好了,那么這架飛機就只能是這個編號了.

#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <queue> #include <cmath> #define RG register #define il inline #define iter iterator #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; const int N=2005,M=10005; int n,m,a[N],num=0,head[N],to[M],nxt[M],du[N],in[N],ret[N]; void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;} struct node{int x,v;bool operator <(const node &pr)const{return v<pr.v;} }; priority_queue<node>q; void solve1(){for(int i=1;i<=n;i++){in[i]=du[i];if(!in[i])q.push((node){i,a[i]});}int x,cnt=n;while(!q.empty()){x=q.top().x;q.pop();ret[cnt--]=x;for(int i=head[x];i;i=nxt[i]){int u=to[i];in[u]--;if(!in[u])q.push((node){u,a[u]});}}for(int i=1;i<=n;i++)printf("%d ",ret[i]);puts(""); } inline int solve2(int li){while(!q.empty())q.pop();for(int i=1;i<=n;i++){if(i==li)in[i]=-1;else {in[i]=du[i];if(!in[i])q.push((node){i,a[i]});}}for(int k=n;k>=1;k--){if(q.empty())return k;int x=q.top().x;q.pop();if(k>a[x])return k;for(int i=head[x];i;i=nxt[i]){int u=to[i];in[u]--;if(!in[u])q.push((node){u,a[u]});}}return 1; } void work() {int x,y;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);link(y,x);du[x]++;}solve1();for(int i=1;i<=n;i++)printf("%d ",solve2(i)); }int main() {work();return 0; }

轉載于:https://www.cnblogs.com/Yuzao/p/8042563.html

總結

以上是生活随笔為你收集整理的bzoj 2109: [Noi2010]Plane 航空管制的全部內容,希望文章能夠幫你解決所遇到的問題。

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