三分法问题个人总结&MS_活动中心问题
2014-04-24 20:28
381 查看
看了一下微软2014编程之美大赛的初赛第一阶段的题目,其中最后一道题,看完之后一点思路都没有,同学说穷举肯定超时,经高手指点,最终方法应该是:
使用三分法求解凹(凸)函数的极值问题,所以做了两道三分法求极值的问题练手,现总结如下。
注:本文所总结内容还借鉴了博主:rabia在博客http://blog.csdn.net/rabia/article/details/7826144中所描述的内容:
二分法作为分治中最常见的方法,在各种比赛中经常出现(如:POJ 1434),但只适用于单调函数,若遇到凸(凹)函数求解极值,可采取三分的方法求解。凸(凹)函数在高数中的定义是:若函数的二阶导数在区间上恒大于0,则该函数在区间为凸函数;反之,小于0为凹函数。在比赛中面对一个问题而推出的求解函数f,求解其二阶导数不是那么容易。为了提高出题效率,可以根据题目所求做出大胆的假设:即若求最大值,则可假设函数为凸的;若求最小值,则可假设函数为凹的(当然求最短路等图论问题除外),具体的三分方法如图:
![](http://img.blog.csdn.net/20140424201906343)
![](http://img.blog.csdn.net/20140424201923968)
核心程序段(求解凸函数)如下:
求解极小值则只需要换成if(f(midmid)-f(mid)>esp)即可
比较不错的题目有:
PKU3301 HDU2438
ZJU3203 Ural1874
LightOJ1146、1240 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)
样例输入
样例输出
使用三分法求解凹(凸)函数的极值问题,所以做了两道三分法求极值的问题练手,现总结如下。
注:本文所总结内容还借鉴了博主: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
LightOJ1146、1240 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; }
相关文章推荐
- C#中的委托与事件详解<个人总结>
- #个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &&FZU 1884 排火车 模拟)
- <C/C++>C语言字节对齐问题总结
- 编程之美 活动中心问题与三分法
- #个人赛第七场解题总结# (FZU 1888 三角形问题II && FZU 1886 音乐 )
- CATIA安装问题解决&nbsp;(个人拙见)
- "select一直返回0"的问题解决和总结
- ssh错误总结1.1----关与struts2中极为恶心的<s:action>标签问题
- "Failed to load session “ubuntu"问题解决总结
- « AFNetworking 图片的本地缓存问题 Get application bundle seed ID in iOS » AFNetworking 使用总结 (用法+JSON解析)
- "分析器错误信息: 未能加载类型“WebApplication1.Global”。"类似问题总结。
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- iOS7 UI改变总结 & iOS7适配遇到的一些问题
- [转]QTP&nbsp;个人总结&nbsp;(初级)
- php 解决 json_encode 数据进入数据库 把"\" 去掉的问题
- centos用户&组权限&添加删除用户问题总结
- "SQLServer不存在或访问被拒绝"问题的解决
- "Your project contains error(s),please fix them before running your application"问题解决
- 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题