【問題描述】
某國上空有 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...