調整衛星(2 SAT 二分答案)

2021-08-20 19:04:25 字數 1534 閱讀 4705

【問題描述】

某國上空有 n 顆衛星。 每顆衛星有一次調整的機會(必須調整一次), 方式是衛星可以向 y 軸正方向移動或 y 軸負方向移動指定長度。 現在請你給每個衛星發出指令, 讓衛星向正方向移動或是負方向移動, 使得最後衛星分布中最近的兩顆衛星的距離最遠。請輸出最近兩顆衛星距離的平方。

【輸入格式】

輸入第一行為乙個數 n, 表示有 n 顆衛星。

接下來的 n 行描述了 n 顆衛星, 每行三個整數分別表示衛星的座標 x,y,和衛星可以移動的距離。

【輸出格式】

輸出乙個整數表示答案。

【輸入樣例】

31 6 4

2 6 3

1000 5 3

【輸出樣例】

50【樣例解釋】

三顆衛星。 座標分別為(1,6)(2,6)(1000,5), 第 1 顆衛星可以向上或向下移 4 個單位, 第 2 顆衛星可以向上或向下移 3 個單位, 第 3 顆衛星可以向上或向下移 3 個單位。 那麼最好的方案是一號衛星向上移, 二號衛星向下移, 三號衛星隨意。 或是一號衛星向上移, 二號衛星向下移, 三號衛星隨意。 這樣移動後最近的衛星為一號衛星和二號衛星, 距離的平方為 7*7+1*1=50

【資料範圍】

30%的資料滿足:n<=10, 座標絕對值與移動距離小於 100

60%的資料滿足:n<=100, 座標絕對值與移動距離絕對值小於 1000

100%的資料滿足:n<=1000, 座標絕對值與移動距離均在整數範圍內

分析:1.每個衛星有兩種情況,容易想到用2-sat;

2.資料規模小,並且看到「最小的最大」,可以確定二分答案;

3.思路:

每次二分答案後要根據猜的答案重新建邊;

衝突的情況:兩個衛星的某種移動方法使它們的距離小於了猜的答案,因為答案猜的是最小距離,故不能比猜的答案還小;

4.建邊:每個衛星x,兩種情況,一種向上移動,一種向下移動;假定向上移動就是x,向下移動是x+n(n是總衛星數);

#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=1005;

int np,n,last[maxn*2],op[maxn*2];

ll mid,x[maxn],y[maxn],k[maxn];

struct edgee[maxn*maxn*6];

void addedge(int u,int v)

; last[u]=np;

}char c;

void qkscanf(ll &x)

ll dis(ll x1,ll y1,ll x2,ll y2)

int vis[maxn*2],stk[maxn*2],top;

bool dfs(ll i)

return 1;

}void init()

bool check()

printf("%lld",r);

return 0;

}

COJ 1253 二分 2 sat判定

x城的精神病院只有兩個病房,一共關著n 名病人,編號分別為1 n。病人之間的關係有時極不和諧。很多病人之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 不和諧值 乙個正整數值 來表示某兩名病人之間的仇恨程度,不和諧值越大,則這兩名病人之間的積怨越多。如果兩名不和諧值為c 的病人被關在同一...

POJ 2723 二分 2 sat 判定

此題的題意很簡單,有一些個門,還有2 n個鑰匙分成了n組,每組裡有兩把鑰匙,並且每組中只能使用一把鑰匙,然後每個門有兩把鎖,分別對應著鑰匙,兩個鎖只要任意開乙個門就會開啟,並且,要開啟乙個門,必須保證他序號之前的所有門都開啟了,類似於一關一關的往裡闖 然後思路的話,由於是必須順序的開門,所以可以進行...

演算法學習 二分搜尋二分答案2

顧名思義,二分答案就是用二分查詢的思路去找答案,下面通過舉例來說明。題目 p1873 砍樹 砍下樹木的高度 h 從 0 一直到所有樹木中最高的高度 hmax 依次遞增,我們可以此為依據進行二分搜尋得出答案。includeusing namespace std long long n,m,arr 10...