時間限制:
2000ms
單點時限:
1000ms
記憶體限制:
256mb
第一行為乙個整數t,表示資料組數。
每組資料第一行為四個整數:n, m, a, b。
接下來的a+b行每行兩個整數x, y,代表乙個座標,前a行表示各使用者的座標,後b行表示各通訊公司的座標。
對於每組資料輸出一行"case #x: y",x代表資料編號(從1開始),y代表所求最小代價。
1 ≤ t ≤ 20
1 ≤ x ≤ n
1 ≤ y ≤ m
1 ≤ b ≤ 100
小資料1 ≤ n, m ≤ 100
1 ≤ a ≤ 100
大資料1 ≤ n, m ≤ 107
1 ≤ a ≤ 1000
樣例輸入
23 3 4 1
1 22 1
2 33 2
2 24 4 4 2
1 22 4
3 14 3
1 41 3
樣例輸出
case #1: 4case #2: 13
2.解題思路:本題要求找乙個合適的位置建立乙個基站,使得總費用最小。根據題意描述,費用包含兩個部分,第一部分是使用者到基站的歐幾里得距離的平方,第二個是到最近的通訊公司的曼哈頓距離。不難想象,這個基站的位置應該大致處於n個使用者中間的區域。其實,可以通過列式推導出最合適的位置的大致區域。
首先考慮使用者的距離之和d1=sum+sum,如果距離達到最小,那麼該點一定是乙個極小值點。根據高等數學的知識,該處的偏導數都為0,。因此可以事先對x,y求偏導。發現,x=sum/n,y=sum/n,因此可以對該點以及周圍的8個點進行搜尋。那麼曼哈頓距離此時是否為最小呢?不難發現,曼哈頓距離的改變量每移動一格只會變化最多乙個距離,但歐幾里得距離最大的變化量會大於1個距離單位,因此應該盡量保證d1達到最小。
因此,只需要在平均值以及其周圍的8個點中找出總距離最小的,就是最終的結果了。
3.**:
#define _crt_secure_no_warnings
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define mxn 200005
#define ll long long
#define mp make_pair
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define for(i, a, b) for (int i = a; i < b; ++i)
int dx = ;
int dy = ;
ll abs(ll x)
struct point
; point(ll x, ll y) :x(x), y(y){}
point operator - (const point& b) const //過載減號,方便輸入
void input()
ll dis() //歐幾里得距離的平方
ll len() //曼哈頓距離
}a[1005], b[105];
ll cal(point o, int a, int b) //計算(a,b)點出的總距離
int main()
cout << "case #" << ++cas << ": " << ans << endl;
} return 0;
}
2015程式設計之美(資格賽) 基站選址
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 第一行為乙個整數t,表示資料組數。每組資料第一行為四個整數 n,m,a,b。接下來的a b行每行兩個整數x,y,代表乙個座標,前a行表示各使用者的座標,後b行表示各通訊公司的座標。對於每組資料輸出一行 case x y x代表資...
基站選址(程式設計之美2015資格賽)
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 第一行為乙個整數t,表示資料組數。每組資料第一行為四個整數 n,m,a,b。接下來的a b行每行兩個整數x,y,代表乙個座標,前a行表示各使用者的座標,後b行表示各通訊公司的座標。對於每組資料輸出一行 case x y x代表資...
程式設計之美2015資格賽
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year ...