藍橋杯練習系統 歷屆試題 郵局 (詳細解釋)

2021-09-19 11:56:43 字數 1548 閱讀 3091

時間限制: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 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如果存在多種解答,請輸...