工厂选地址问题

原创 2012年03月21日 23:13:54

【座右铭】1. 想要成为行家,就必须尝试解决大量的问题;

                    2. 解决大量问题并不代表能解决所有问题,而是表示解决下一个问题的几率变大了

1.12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、 31、38、39、47.在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短, 问应该选哪三个厂 ?【问题来源于v_JULY_v的博客:http://blog.csdn.net/v_july_v/article/details/6880698

第一部分:思路

1. 工厂是按照距离从小到大排序好的

2. 在N个工厂中选出1个原材料供应厂,则选取中位数所在的工厂,距离是最短的

3. 设A(i,j)表示前i个工厂选取j个原料供应厂的最短距离,B(m,n)表示从第m个工厂到第n个工厂选取1个原材料供应厂的最短距离。则有如下推导式:

A(i,j) = Min { A(t,j-1) + B(t+1,i) }  1<=t<i, t>=j-1

第二部分:Java代码,不考虑异常情况

/**
	 * 12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、
	 * 31、38、39、47.在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短,
	 * 问应该选哪三个厂 ?
	 * @param factory
	 * 每个工厂离公路最西端的距离
	 * @param len
	 * 工厂的数量
	 * @param number
	 * 原材料工供应厂的数量
	 * @return
	 * 返回1个number+1的数组,数组第1项为最短距离,余下number项为原材料供应厂
	 */
	public static int[] select(int[] factory, int len, int number)
	{
		int[][] former = new int[len][number+1],
		latter = new int[len][number+1], tmp = null;
		//初始化
		for(int p=0;p<len;p++)
		{
			former[p][0] = distance(factory, 0, p);
			former[p][1] = factory[p>>1];			
		}
		//动态规划
		for(int j=2;j<=number;j++)
		{
			for(int i=0;i<len;i++)
			{
				if(i+1<j) //工厂的数量少于原材料供应厂
				{
					continue;
				}else
				{
					latter[i][0] = Integer.MAX_VALUE;
					for(int t=i-1;t>=0;t--)
					{
						if(t+1<j-1) //工厂的数量少于原材料供应厂
						{
							continue;
						}else
						{
							int curDis = former[t][0] + distance(factory, t+1, i);
							if(latter[i][0]>curDis)
							{
								latter[i][0] = curDis;
								for(int m=1;m<=j-1;m++)
								{
									latter[i][m] = former[t][m];
								}
								latter[i][j] = factory[(t+1+i)>>1];
							}
						}
					}
				}
			}
			//交换
			tmp = latter;
			latter = former;
			former = tmp;
		}
		return former[len-1];
	}
	
	/**
	 * 求从第m个工厂到第n个工厂设1个原料供应厂的最短距离
	 */
	static int distance(int[] factory, int left, int right)
	{
		int mid = (left+right)>>1;
		int dis = 0;
		for(int i=left;i<=right;i++)
		{
			int dif = factory[i]-factory[mid];
			dis += ((dif>0)?dif:-1*dif);
		}
		return dis;
	}

第三部分:测试用例

工厂:{0,4,5,10},选取1个原材料供应厂: {11,4},最短距离为11,选取4做原材料供应厂

工厂:{0,4,5,10},选取2个原材料供应厂: {5,4,10}最短距离为5,选取4,10做原材料供应厂

工厂:{0,4,5,10,12},选取2个原材料供应厂: {7,4,10},最短距离为7,选取4,10做原材料供应厂

工厂:{0,4,5,10,12},选取3个原材料供应厂: {3,0,4,10},最短距离为3,选取0,4,10做原材料供应厂

工厂:{0,4,5,10,12,18,27,30,31,38,39,47},选取3个原材料供应厂: {43,5,27,39},最短距离为43,选取5,27,39做原材料供应厂

[POI2000]啤酒厂选址

这道题思路很简单,但是有很多蛋疼的细节需要注意。 一个比较笨的方法是从0到n-1扫描,把环分成两段,一段是顺时针走来的,一段是逆时针走来的,它们在当前所选的啤酒厂处相交,然后维护一下这两段。那么实际...
  • TA201314
  • TA201314
  • 2015年04月17日 07:45
  • 2494

Java设计模式之四(经典面试题:工厂模式在开发中的运用)

一、工厂模式在开发中的运用 面试题:       写一个简单的计算器。 代码实现: 抽象一个运算类: package com.qianyan.calcuator; public...
  • shaopeng5211
  • shaopeng5211
  • 2013年04月14日 09:31
  • 2237

抽象工厂的缺点和解决方法

先上干货,后面才是代码例子: 参考《设计模式之禅》的话“抽象工厂模式是工厂方法模式的升级版本”。其实就是用工厂方法生产具有多维度变化的产品类。什么是多维度的类?即一个类会有多个维度会影...
  • always_ming
  • always_ming
  • 2016年04月16日 09:33
  • 1327

java软件代码自动化生成工具--软工厂附带学习地址

  • 2013年04月23日 10:48
  • 61KB
  • 下载

网页代码工厂-E-mail地址篇

  • 2006年03月16日 00:00
  • 1.22MB
  • 下载

Hadoop--MapReduce【表内容的关联】查找孙子和祖父,合并工厂地址表

import java.io.IOException; import java.util.StringTokenizer; import java.util.Vector; import org....
  • ckl_soft
  • ckl_soft
  • 2012年10月21日 23:56
  • 1269

检索 COM 类工厂中 CLSID 为 {96749377-3391-11D2-9EE3-00C04F797396} 的组件失败,没有注册类问题分析和解决办法

  • 2016年07月20日 15:05
  • 3.37MB
  • 下载

格式工厂(各种格式没问题)

  • 2013年04月22日 12:31
  • 16.54MB
  • 下载

MPC563 boot地址问题

  • 2017年08月17日 12:54
  • 150KB
  • 下载

建模中的地址问题

  • 2014年04月28日 17:10
  • 29KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工厂选地址问题
举报原因:
原因补充:

(最多只允许输入30个字)