歷屆試題 郵局(dfs 剪枝)

2022-05-11 10:10:31 字數 1407 閱讀 9478

歷屆試題 郵局  

時間限制: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。

感覺這道題還是很不錯的,剛開始沒怎麼看資料量,寫的**超時了

超時思路:m個備用郵局,建k個,如果用1,0表示建跟不建,那麼陣列中就有k個1,m-k個0,所以全排列之後就是每乙個方案,然後計算出每一組方案的話費,之後取最優花費,但是有的資料比較大,比如50,如果有10個郵局,那麼方案就有很多很多,組合數公式算下來肯定崩,但是這個思路對於小的資料應該還是可以的,先上超時**:

#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

struct node

a[60],b[60];

int n,m,k,s[60],num[60];

double dis(int x,int y)

double dfs()

;float yc[27][55],s=1000000000;

int dfs(int t,int i,int o[12],float w[55],float sum)}}

else

}if(f1&&f2)//¼ôö¦

else

dfs(t+1,i+1,o,ww,sum);//µúi¸öµã¿éòô¸üðâww¾íê¹óã¸ãµã}}

}}int main()

dfs(0,1,o,w,0);

for(i=0;i

藍橋杯試題 歷屆試題 郵局

題中的資料量很小,但單純的回溯會超時,所以需要剪枝,這裡減了三個枝。1.當即使所有剩餘點都算上都不能取k個點時。2.當當前點大於k個時。3.當發現加入乙個點後距離陣列沒有變化時,說明這個點可有可無以後不再計算。include include include include using namespa...

試題 歷屆試題 剪格仔 dfs

題意 給乙個n m的矩陣,用線分割成兩部分,兩部分數值的加和相同,可能有多種結果,輸出其中一種結果是包含左上角且這部分分割的塊數最小的數值。思路 dfs都走一遍邊走邊判斷另一半與這一半的值是否相等,相等則更新含左上角的那部分數量。主要是通過標記走過,返回的時候還要再把標記和刪掉。include us...

歷屆試題 剪格仔 (DFS)

link 問題描述 如下圖所示,3 x 3 的格仔中填寫了一些整數。10 1 52 20 30 1 1 2 3 我們沿著圖中的星號線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的m x n 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如...