LA3211 訓練指南 飛機排程 2 sat

2022-05-27 14:09:10 字數 1210 閱讀 2986

題意

有n嫁飛機需要著陸。每架飛機都可以選擇「早著陸」和「晚著陸」兩種方式之一,且必須選擇一種。第i架飛機的早著陸時間為ei,晚著陸時間為li,不得在其他時間著陸。你的任務是為這些飛機安排著陸方式,使得整個著陸計畫盡量安全。話句話說,如果把所有飛機的實際著陸時間按照從早到晚的順序排列,相鄰兩個著陸時間間隔的最小值(稱為安全間隔)應盡量大。

分析看到最小值最大立刻會想到二分。大體思路很好想,我們二分這個安全間隔,然後判斷是否可行。那麼這個題的難點就變為如何判斷這個安全間隔是否可行。

n架飛機,每架飛機要麼選擇早起飛要麼選擇晚起飛,對應著2-sat問題中n個布林型變數每個變數要麼為真,要麼為假。那麼那m個限制條件是什麼呢? 

我們假設當前二分的安全間隔是p,那麼如果兩個時間小於p,則說明兩個時間不能同時選擇。比如說ei和lj的時間差小於p,則說明ei和lj不能同時選擇。所以要麼選擇li和lj,要麼選擇ei和ej,要麼選擇li和ej。也就是說,xi晚起飛或者xj早起飛。到這裡這個題就完全轉化為了2-sat問題。

下面是ac的**

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

8using

namespace

std;

9const

int maxn=2000+10;10

struct

twosat

23return

true;24

}25void init(int

n)30

void add_clause(int x,int xval,int y,int

yval)

3637

bool

solve()45}

46}47return

true;48

}49}solver;

50int n,t[maxn][2

];51

bool test(int

diff)59}

60}61}

62return

solver.solve();63}

64int

main()72}

73while(l

80 printf("

%d\n

",l);81}

82return0;

83 }

view code

LA 3211 飛機排程(2 SAT)

題意 有n架飛機需要著陸,每架飛機都可以選擇 早著陸 和 晚著陸 兩種方式之一,且必須選擇一種,第i架飛機的早著陸時間為e,晚著陸時間為l,不得在其他時間著陸。你的任務是為這些飛機安排著陸方式,使得整個著陸計畫盡量安全。換句話說,如果把所有飛機的實際著陸時間按照從早到晚的順序排列,相鄰兩個著陸時間間...

LA11248 訓練指南 網路擴容 最大流

題意 給定乙個有向網路,每條邊均有乙個容量。問是否存在乙個從點1到點n,流量為c的流。如果不存在,是否可以恰好修改一條弧的容量,使得存在這樣的流?分析 先跑一遍最大流,如果最大流大於等於c,則輸possible。如果最大流小於c,則表明需要修改邊的流量。很顯然,需要修改的弧一定是滿流的弧。但是如果直...

LA2531 訓練指南 足球聯賽 最大流

題意 有n支隊伍進行比賽,每支隊伍需要打的比賽數目相同。每場比賽恰好一支隊伍勝,另一支敗。給出每支隊伍目前勝的場數和敗的場數,以及每兩支隊伍還剩下的比賽場數,確定所有可能的冠軍的球隊。獲勝場數最多的是冠軍,可以並列 分析乙隻隊伍如果可能得冠軍,那麼就一定可以通過調整,未來的幾場比賽的結果使自己贏得場...