時間限制:1.0s 記憶體限制:256.0mb
問題描述
c村住著n戶村民,由於交通閉塞,c村的村民只能通過信件與外界交流。為了方便村民們發信,c村打算在c村建設k個郵局,這樣每戶村民可以去離自己家最近的郵局發信。
現在給出了m個備選的郵局,請從中選出k個來,使得村民到自己家最近的郵局的距離和最小。其中兩點之間的距離定義為兩點之間的直線距離。
輸入格式
輸入的第一行包含三個整數n, m, k,分別表示村民的戶數、備選的郵局數和要建的郵局數。
接下來n行,每行兩個整數x, y,依次表示每戶村民家的座標。
接下來m行,每行包含兩個整數x, y,依次表示每個備選郵局的座標。
在輸入中,村民和村民、村民和郵局、郵局和郵局的座標可能相同,但你應把它們看成不同的村民或郵局。
輸出格式
輸出一行,包含k個整數,從小到大依次表示你選擇的備選郵局編號。(備選郵局按輸入順序由1到m編號)
樣例輸入
5 4 2
0 02 0
3 13 3
1 10 1
1 02 1
3 2樣例輸出
2 4資料規模和約定
對於30%的資料,1<=n<=10,1<=m<=10,1<=k<=5;
對於60%的資料,1<=m<=20;
對於100%的資料,1<=n<=50,1<=m<=25,1<=k<=10。
#include#include#include#includeusing namespace std;
//n戶村民,m個備選郵局,選k個
int n,m,k;
double home[51][2];//村民數
double stamp[26][2];//郵局
double s[26][51];//每個備選郵局到每戶人家的距離
double sum=100000001;
int ans[16];
//choice: 已經選取的郵局數,遍歷初始值就是 0 個(表示當前未選擇任何郵局)
//cur: 當前郵局編號,遍歷時,它的值就是從第0個到第m個
//w: 用來記錄每乙個居民到郵局的最近距離
// a :用來記錄當前遍歷過程中選取的k個郵局
// 初始值 :0 ,0 ,w ,a
void dfs(int choice,int cur, double w[51],int a[16])
for(int i=0;i>stamp[i][0]>>stamp[i][1];//輸入郵局座標
for(int j=0;j} double w[51];//用來記錄每乙個居民到郵局的最近距離
for(int i=0;iint a[16];//用來記錄當前遍歷過程中選取的k個郵局(第乙個,第二個..按郵局順序記錄)
//第乙個0:已經選取的郵局數,遍歷初始值就是 0 個(表示當前未選擇任何郵局)
//第二個0:當前郵局編號,遍歷時,它的值就是從第0個到第m個
dfs(0,0,w,a);
for(int i=0;ireturn 0;
}
藍橋杯試題 歷屆試題 郵局
題中的資料量很小,但單純的回溯會超時,所以需要剪枝,這裡減了三個枝。1.當即使所有剩餘點都算上都不能取k個點時。2.當當前點大於k個時。3.當發現加入乙個點後距離陣列沒有變化時,說明這個點可有可無以後不再計算。include include include include using namespa...
藍橋杯練習系統 歷屆試題 買不到的數目
問題描述 小明開了一家糖果店。他別出心裁 把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合...
演算法練習 藍橋杯歷屆試題 剪格仔 DFS C
如下圖所示,3 x 3 的格仔中填寫了一些整數。10 1 52 20 30 1 1 2 3 我們沿著圖中的星號線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的m x n 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如果存在多種解答,請輸...