三分法问题个人总结&MS_活动中心问题_石头_奋斗的博客-程序员秘密

技术标签: 基础算法  算法小题_查找_三分法_1  

看了一下微软2014编程之美大赛的初赛第一阶段的题目,其中最后一道题,看完之后一点思路都没有,同学说穷举肯定超时,经高手指点,最终方法应该是:

  使用三分法求解凹(凸)函数的极值问题,所以做了两道三分法求极值的问题练手,现总结如下。

  注:本文所总结内容还借鉴了博主:rabia在博客http://blog.csdn.net/rabia/article/details/7826144中所描述的内容:

  二分法作为分治中最常见的方法,在各种比赛中经常出现(如:POJ 1434),但只适用于单调函数,若遇到凸(凹)函数求解极值,可采取三分的方法求解。凸(凹)函数在高数中的定义是:若函数的二阶导数在区间上恒大于0,则该函数在区间为凸函数;反之,小于0为凹函数。在比赛中面对一个问题而推出的求解函数f,求解其二阶导数不是那么容易。为了提高出题效率,可以根据题目所求做出大胆的假设:即若求最大值,则可假设函数为凸的;若求最小值,则可假设函数为凹的(当然求最短路等图论问题除外),具体的三分方法如图:

  

核心程序段(求解凸函数)如下:

while(r-l>esp){ 

     double mid=(l+r)/2.0; 

     double midmid=(mid+r)/2.0;

           if(f(mid)-f(midmid)>esp)r=midmid; 

           else l=mid; 

 }

求解极小值则只需要换成if(f(midmid)-f(mid)>esp)即可

比较不错的题目有:

PKU3301   HDU2438   ZJU3203   Ural1874  LightOJ11461240 CodeForces185B

下面是微软编程之美大赛第一阶段初赛第三体“活动中心”和本人的"含水"代码:

时间限制: 12000ms
单点时限: 6000ms
内存限制: 256MB

描述

A市是一个高度规划的城市,但是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心,方便居住在A市的居民们能随时开展运动,锻炼强健的身心。

城市规划局希望活动中心的位置满足以下条件:

1. 到所有居住地的总距离最小。

2. 为了方便活动中心的资源补给和其他器材的维护,活动中心必须建设在A市的主干道上。


为了简化问题,我们将A市摆在二维平面上,城市的主干道看作直角坐标系平的X轴,城市中所有的居住地都可以看成二维平面上的一个点。

现在,A市的城市规划局希望知道活动中心建在哪儿最好。


输入

第一行包括一个数T,表示数据的组数。

接下来包含T组数据,每组数据的第一行包括一个整数N,表示A市共有N处居住地

接下来N行表示每处居住地的坐标。


输出

对于每组数据,输出一行“Case X: Y”,其中X表示每组数据的编号(从1开始),Y表示活动中心的最优建造位置。我们建议你的输出保留Y到小数点后6位或以上,任何与标准答案的绝对误差或者相对误差在10-6以内的结果都将被视为正确。


数据范围

小数据:1 ≤ T ≤ 1000, 1 ≤ N ≤ 10

大数据:1 ≤ T ≤ 10, 1 ≤ N ≤ 105

对于所有数据,坐标值都是整数且绝对值都不超过106



样例解释

样例1:活动中心的最优建造位置为(1.678787, 0)



样例输入
1
3
1 1
2 2
3 3
样例输出
Case 1: 1.678787
// MS_ActivityCenter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;

int t;//the number of test cases
const int max_x=1000000;
const int min_x=-1000000;

double calculateSumDis(int n,double x);

struct pos
{
	int x;
	int y;
	pos(int x,int y)
	{
		x=x;
		y=y;
	};
	pos()
	{
		x=0;
		y=0;
	}
};

pos positions[100000];

int main()
{
	cin>>t;
	int currentCase=1;
	while (t>0)
	{
		int n;//n positions
		double right,left;
		double mid;

		cin>>n;
		right=min_x;
		left=max_x;

		for (int i=0;i<n;i++)
		{
			cin>>positions[i].x;
			cin>>positions[i].y;
			if (positions[i].x>right)
			{
				right=positions[i].x;
			}
			if (positions[i].x<left)
			{
				left=positions[i].x;
			}
		}

		do 
		{
			mid=(right+left)/2.0;
			double midmid=(mid+right)/2.0;

			double sumDismid=calculateSumDis(n,mid);
			double sumDismidmid=calculateSumDis(n,midmid);

			if (sumDismid>sumDismidmid)
			{
				left=mid;
			}
			else
			{
				right=midmid;
			}
		} while (right-left>0.0000001);

		cout<<"Case "<<currentCase<<": "<<setprecision(7)<<mid<<endl;
		
		currentCase++;
		t--;
	}
	return 0;
}

double calculateSumDis(int n,double x)
{
	double sumDismid=0;
	for (int j=0;j<n;j++)
	{
		double powX=pow((positions[j].x-x),2);
		double powY=pow((double)positions[j].y,2);
		sumDismid+=sqrt(powX+powY);
	}
	return sumDismid;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/loveRooney/article/details/24433595

智能推荐

趣图:新手程序员初次做项目的情景_java面试笔试的博客-程序员秘密

扩展阅读趣图:当黑客拿到 root 权限之后趣图:我们的项目进展非常顺利趣图:当我以为这是最后一个Bug时…… ...

Docker实践,部署SpringCloud微服务_manifest for regnode.hzsh:5000/redhat-openjdk-18/o_若依不弃的博客-程序员秘密

Docker部署SpringCloud微服务公司的项目springcloud微服务项目上,并且是用docker部署项目以下是操作步骤部署流程1、创建项目镜像准备的文件夹mkdir /home/dockerhome/hzsh-lims-service/2、创建dockerfile文件vim /home/dockerhome/hzsh-lims-service/dockerfile...

kellte定时任务-后台运行配置方式bat (下)_kellte任务执行_Deng_7788的博客-程序员秘密

初步的配置查看:kellte定时任务-后台运行配置方式bat (上)日志按日期生成在windows上时间参数获取set "ymd=%date:~,4%-%date:~5,2%-%date:~8,2%"echo %ymd% cmd上运行的效果如果日志需要按天分可以修改bat内容在里面添加set “ymd=%date:,4%-%date:5,2%-%date:~8,2%”,并且在日志...

最恐怖的12个英语单词_MRman0404的博客-程序员秘密

1. honorificabilitudinitatibus  这个字是由27个字母组成的。出现在大文豪莎士比亚的剧本「空爱一场」love\’s labou  \’s lost里,意思是「不胜光荣」。      2. antidisestablishmentarianism  这个字是由28个字母组成的。根据范克和华格若尔斯编的「英语新标准辞」里面的解释  ,这个字的意思...

简单的java内存结构,一句话概括“堆、栈、方法区详解”_e根油条的博客-程序员秘密

jvm 1、什么是jvm java程序的运行环境(二进制字节码的运行环境) 2、jvm特点 1、一次编写,导出运行 2、自动管理内存,垃圾回收功能,刚开始java竞标的是c语言,c语言需要自己管理内存,不慎就会内存泄漏,java减少了程序员出错的机会 3、数组下标越界检查,c语言如果下标越界,可能覆盖其他代码的内存,非常严重。...

microbiomeViz:绘制lefse结果中Cladogram_cladogram图怎么分析_一个人旅行*-*的博客-程序员秘密

平日经常会分析shotgun宏基因组的数据,我们的pipeline使用MetaPhlAn,Kraken等profiler。这种数据经常会产生一个表格,如下download.file("https://bitbucket.org/biobakery/biobakery/raw/tip/demos/biobakery_demos/data/metaphlan2/output/SRS014459-Stool_profile.txt", 'SRS014459-Stool_profile.txt')knitr

随便推点

JAVA篇_线程锁synchronized、lock与死锁_java锁synchronized与lock_爱喝可乐的程序猿的博客-程序员秘密

在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。区别:1、lock是一个接口,而synchronized是java的一个关键字。2、synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生,Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:3、Lock是显示锁(需要手动开关),synchronized始于隐式

关于MySQL Workbench导入.csv文件的一种错误_StringKai的博客-程序员秘密

今天使用MySQL Workbench导入一个.csv文件死活不成功后来我仔细看了报错才发现原来是csv文件的表头重复了。。

广技师专插本计算机专业招生,2020年广东技术师范大学专插本各专业最低投档分数线..._绿豆貉的博客-程序员秘密

原标题:2020年广东技术师范大学专插本各专业最低投档分数线 2020年广技师专插本招生专业计划数文科类、理科类、艺术类、职教师资类共投档553名,招生各专业投档最低分数线公布如下: 图中就是今年广技师今年各个招生专业的投档分数线和投档数,其中财务会计教育专业的投档数和最低投档分数线是最高的,退役士兵人数也是在其余专业中最多的。 从上图中,我们可以知道广技师计划招生人数为881人,实际录取人数为5...

(jQuery Datatable)jQuery Datatable_betterbo的博客-程序员秘密

参考资源http://blog.csdn.net/builderwfy/article/details/50401302http://ask.csdn.net/questions/257315http://blog.csdn.net/panbo434557245/article/details/39050071// *************************************//

有限元固体力学计算软件code_aster集成平台Salome_meca的安装问题记录_salome meca_zzoe5的博客-程序员秘密

有限元固体力学计算软件Salome_Meca--&gt;code_aster安装问题记录前言salome_meca2018安装功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言由于code_aster自身的版本升级和linux

r ridge回归_R语言中的岭回归、套索回归、主成分回归:线性模型选择和正则化_weixin_39695241的博客-程序员秘密

原文链接:http://tecdat.cn/?p=9913​tecdat.cn概述和定义在本课程中,我们将考虑一些线性模型的替代拟合方法,除了通常的 普通最小二乘法。这些替代方法有时可以提供更好的预测准确性和模型可解释性。预测精度:线性,普通最小二乘估计将具有低偏差。OLS也表现良好, n &gt;&gt; p。但是,如果 n 不比p大很多 ,则拟合可能会有很多可变性,从而导致拟合过...

推荐文章

热门文章

相关标签