1. 程式人生 > >2016藍橋杯假期任務之《郵局》

2016藍橋杯假期任務之《郵局》

問題描述   C村住著n戶村民,由於交通閉塞,C村的村民只能通過信件與外界交流。為了方便村民們發信,C村打算在C村建設k個郵局,這樣每戶村民可以去離自己家最近的郵局發信。

  現在給出了m個備選的郵局,請從中選出k個來,使得村民到自己家最近的郵局的距離和最小。其中兩點之間的距離定義為兩點之間的直線距離。 輸入格式   輸入的第一行包含三個整數n, m, k,分別表示村民的戶數、備選的郵局數和要建的郵局數。
  接下來n行,每行兩個整數x, y,依次表示每戶村民家的座標。
  接下來m行,每行包含兩個整數x, y,依次表示每個備選郵局的座標。
  在輸入中,村民和村民、村民和郵局、郵局和郵局的座標可能相同,但你應把它們看成不同的村民或郵局。 輸出格式   輸出一行,包含k個整數,從小到大依次表示你選擇的備選郵局編號。(備選郵局按輸入順序由1到m編號) 樣例輸入 5 4 2
0 0
2 0
3 1
3 3
1 1
0 1
1 0
2 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。 程式碼如下:
import java.util.Scanner;

public class Main {

	static int n, m, k, j, f1, f2;
	static int[][] a = new int[55][2];
	static int[][] b = new int[27][2];
	static int[] c = new int[12];
	static int[] d = new int[55];
	static float[][] yc = new float[27][55];
	static float s = 1000000000;

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int i, j;
		int[] o = new int[12];
		float[] w = new float[55];
		n = input.nextInt();
		m = input.nextInt();
		k = input.nextInt();
		for (i = 1; i <= n; i++) {
			a[i][0] = input.nextInt();
			a[i][1] = input.nextInt();
		}
		for (i = 1; i <= m; i++) {
			b[i][0] = input.nextInt();
			b[i][1] = input.nextInt();
			for (j = 1; j <= n; j++)
				yc[i][j] = (float) Math.sqrt((a[j][0] - b[i][0])
						* (a[j][0] - b[i][0]) + (a[j][1] - b[i][1])
						* (a[j][1] - b[i][1]));
		}
		dfs(0, 1, o, w, 0);
		for (i = 0; i < k; i++)
			System.out.print(c[i] + " ");

	}

	private static void dfs(int t, int i, int o[], float w[], float sum) {
		if (i <= m + 1) {
			if (t == k) {
				if (sum < s) {
					s = sum;
					for (j = 0; j < k; j++)
						c[j] = o[j];
				}
			} else if (i <= m && t < k) {
				float[] ww = new float[55];
				for (j = 1; j <= n; j++)
					ww[j] = w[j];
				dfs(t, i + 1, o, w, sum);
				f1 = 1;
				f2 = 0;
				if (d[i] == 0) {
					o[t] = i;
					if (t > 0) {
						f2 = 1;
						for (j = 1; j <= n; j++) {
							if (ww[j] > yc[i][j]) {
								sum = sum - ww[j] + yc[i][j];
								ww[j] = yc[i][j];
								f1 = 0;
							}
						}
					} else {
						for (j = 1; j <= n; j++) {
							sum += yc[i][j];
							ww[j] = w[j] = yc[i][j];
						}
					}
					if (f1 == 1 && f2 == 1) {
						d[i] = 1;
						dfs(t, i + 1, o, w, sum);
					} else
						dfs(t + 1, i + 1, o, ww, sum);
				}
			}
		}

	}

}

執行結果:
5 4 2
0 0
2 0
3 1
3 3
1 1
0 1
1 0
2 1
3 2
2 4 


相關推薦

2016藍橋假期任務郵局

問題描述   C村住著n戶村民,由於交通閉塞,C村的村民只能通過信件與外界交流。為了方便村民們發信,C村打算在C村建設k個郵局,這樣每戶村民可以去離自己家最近的郵局發信。   現在給出了m個備選的郵局,請從中選出k個來,使得村民到自己家最近的郵局的距離和最小。其中兩點

2016藍橋假期任務《關聯矩陣》

問題描述   有一個n個結點m條邊的有向圖,請輸出他的關聯矩陣。 輸入格式   第一行兩個整數n、m,表示圖中結點和邊的數目。n<=100,m<=1000。   接下來m行,每行兩個整數a

2016藍橋假期任務《三部排序》

標題:三部排序     一般的排序有許多經典演算法,如快速排序、希爾排序等。     但實際應用時,經常會或多或少有一些特殊的要求。我們沒必要套用那些經典演算法,可以根據實際情況建立更好的解法。  

2016藍橋假期任務《最大乘積》

問題描述   對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢? 輸入格式   第一行一個數表示資料組數   每組輸入資料共2行:   第1行給出總共的數字的個數n和要取的數的個數m,1&l

2016藍橋假期任務《十進位制轉十六進位制》

問題描述   十六進位制數是在程式設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進位制數的0至15。十六進位制

2016藍橋假期任務《複數四則運算》

設計複數庫,實現基本的複數加減乘除運算。   輸入時只需分別鍵入實部和虛部,以空格分割,兩個複數之間用運算子分隔;輸出時按a+bi的格式在螢幕上列印結果。參加樣例輸入和樣例輸出。   注意考慮特殊情況,無法計算時輸出字串"error"。 樣例輸入 2 4 * -3

2016藍橋假期任務《2的次冪表示 》

問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0   現在約定冪次用括號來表示,即a^b表示為a(b)   此時,1

2016藍橋假期任務《十六進位制轉八進位制》

問題描述  給定n個十六進位制正整數,輸出它們對應的八進位制數。輸入格式  輸入的第一行為一個正整數n (1<=n<=10)。  接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。輸出格

2016藍橋假期任務《振興中華》

標題: 振興中華     小明參加了學校的趣味運動會,其中的一個專案是:跳格子。     地上畫著一些格子,每個格子裡寫一個字,如下所示:(也可參見p1.jpg) 從我做起振 我做起振興 做起振興中

2016藍橋假期任務《數字遊戲》

問題描述   棟棟正在和同學們玩一個數字遊戲。   遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下一個數字2。再下面的一個同學要從上一

2016藍橋假期任務《比酒量》

    有一群海盜(不多於20人),在船上比拼酒量。過程如下:開啟一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再開啟一瓶酒平分,又有倒下的,再次重複...... 直到開了第4瓶酒,坐著的已經所剩無

2016藍橋假期任務《剪格子》

問題描述 如下圖所示,3 x 3 的格子中填寫了一些整數。 +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +

藍橋實例開發板特點

單片機 以及 三種 one size 分享 總結 為什麽 實驗 本人之前參加了藍橋杯,下面我將總結一下我的經歷,由於本人技能有限,請多見諒! 我之前用過幾種51的板子,說說藍橋杯的板子: 首先開發板設置了三種芯片的插座,說實話,我估計設計者是出於性價比高的考慮,如果

2016藍橋演算法訓練——Torry的困惑(基本型)

問題描述   Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多少呢?他把這個問題告訴老師。老師愣住了,一時回答不出來。於是Torry求助於會程式設計的你,請你算出前n個質數的乘積。不過,考

2016藍橋演算法提高——最大乘積

演算法提高  最大乘積 問題描述   對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢? 輸入格式   第一行一個數表示資料組數   每組輸入資料共2行:   第1行給出總共的數字

2016藍橋省賽java C組第十題 --密碼脫落

暑假以來刷藍橋杯題,實在被暴力所折服,終於碰到一眼前一亮的題~~~ 第一篇線上的部落格,開寫~~~ 密碼脫落 X星球的考古學家發現了一批古代留下來的密碼。 這些密碼是由A、B、C、D 四種植物的種子串成的序列。 仔細分析發現,這些密碼串當初應該是前後對稱的(也就是我們說的映

藍橋 歷屆試題數字遊戲

問題描述   棟棟正在和同學們玩一個數字遊戲。   遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下一個數字2。再下面的一個同學要從上一

藍橋-程式碼填空

身份證校驗—神祕三位數—生日相同概率—四方定理—因數分解—組合數 ①身份證校驗 如果讓你設計個程式,用什麼變數儲存身份證號碼呢?長整數可以嗎?不可以! 因為有人的身份證最後一位是"X" 實際上,除了最後一位的X,不會出現其它字母! 身份證號碼18位 = 17位 + 校驗碼

2016藍橋 四平方和

   好菜好菜,昨晚打CF又掉分了,快要掉到萬里之外了。。。    題目大家都看過,我就不再贅述題目了。如果用4個for迴圈會超時,必須要優化。    直接把兩個數的平方和打表,然後列舉前兩個數,就可以把複雜度降到O(n^2)。   PS:此題用到了打表這個很好的思想。 #

2016藍橋 歷屆往題——迴文數字

歷屆往題   迴文數字 問題描述   觀察數字:12321,123321 都有一個共同的特徵,無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做:迴文數字。   本題要求你找到一些5位或6