歷屆試題 郵局
時間限制: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 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如...