便利店选址
2013-09-12 15:27
309 查看
题目描述:
某小区决定在小区内部建一家便利店,现小区内部共有八栋楼,它们的地理坐标分别为:(10,20) (30,34) (19,25) (38,49.1) (9,38.1) (2,34) (5,8) (29,48)。同时,其中的住户人数分别为:30, 45, 28, 8, 36, 16, 78, 56。为了方便更多的住户购物,要求实现总体最优,请问便利店应该建立在哪里?
【提示】
1)便利店无论选址何处,八栋楼的居民均可直接到达,即八栋楼与便利店均相邻,且距离为直线距离;
2)八栋楼的居民人数为权重,应该方便大多数人,实现总体最优。
感觉好玩的数据结构课程设计题,虽然没发现这题跟数据结构有什么关系。看到这题想了好久没什么思路,没发现什么数据结构可以解这题。枚举点的话,也没有什么好的策略(其实也蛮麻烦)。前几天打了一场warmup,有道题比赛的时候想了好久的,一直以为是搜索,但是数据量太大也没敢写。比赛完了发现那题竟然是用随机算法过的。瞬间感觉随机算法好强大的样子。然后就想到了这题,随机算法太适合不过了。与其苦苦想枚举点的策略,还不如随机打10w个点呢,10w不够?1000w如何?
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
using namespace std;
const int N = 100;
const double inf = 10000000.0;
const double eps = 1e-8;
int people_num
;
struct node
{
double x,y;
}position
;
int n;
double dis(int i,double x,double y)
{
return sqrt((x - position[i].x) * (x - position[i].x) + (y - position[i].y) * (y - position[i].y));
}
double cal(double x,double y)
{
double ret = 0;
for(int i = 1;i <= n;i ++)
ret = ret + dis(i,x,y) * people_num[i];
return ret;
}
int main()
{
int i;
freopen("data.in","r",stdin);
scanf("%d",&n);
double minx,miny,maxy,maxx;
minx = miny = inf;
maxx = maxy = -inf;
for(i = 1;i <= n;i ++)
{
scanf("%lf%lf",&position[i].x,&position[i].y);
if(position[i].x > maxx)
maxx = position[i].x;
if(position[i].x < minx)
minx = position[i].x;
if(position[i].y > maxy)
maxy = position[i].y;
if(position[i].y < miny)
miny = position[i].y;
}
for(i = 1;i <= n;i ++)
scanf("%d",&people_num[i]);
maxx *= 100;
maxy *= 100;
minx *= 100;
miny *= 100;
int lenx = ceil(maxx - minx);
int leny = ceil(maxy - miny);
double ansx,ansy,Max;
Max = inf;
srand((unsigned)time(NULL));
for(i = 1;i <= 100000;i ++)
{
double tmpx = rand()%lenx + minx;
double tmpy = rand()%leny + miny;
tmpx = tmpx / 100;
tmpy = tmpy / 100;
double tmp = cal(tmpx,tmpy);
if(tmp - Max < eps)
{
ansx = tmpx;
ansy = tmpy;
Max = tmp;
}
}
printf("便利店的地址为:(%.2lf,%.2lf)\n",ansx,ansy);
return 0;
}
/*
便利店地址:(16.53,27.43)
最优值:5146.85
*/
随机算法,你值得拥有哟嚯嚯嚯嚯~
某小区决定在小区内部建一家便利店,现小区内部共有八栋楼,它们的地理坐标分别为:(10,20) (30,34) (19,25) (38,49.1) (9,38.1) (2,34) (5,8) (29,48)。同时,其中的住户人数分别为:30, 45, 28, 8, 36, 16, 78, 56。为了方便更多的住户购物,要求实现总体最优,请问便利店应该建立在哪里?
【提示】
1)便利店无论选址何处,八栋楼的居民均可直接到达,即八栋楼与便利店均相邻,且距离为直线距离;
2)八栋楼的居民人数为权重,应该方便大多数人,实现总体最优。
感觉好玩的数据结构课程设计题,虽然没发现这题跟数据结构有什么关系。看到这题想了好久没什么思路,没发现什么数据结构可以解这题。枚举点的话,也没有什么好的策略(其实也蛮麻烦)。前几天打了一场warmup,有道题比赛的时候想了好久的,一直以为是搜索,但是数据量太大也没敢写。比赛完了发现那题竟然是用随机算法过的。瞬间感觉随机算法好强大的样子。然后就想到了这题,随机算法太适合不过了。与其苦苦想枚举点的策略,还不如随机打10w个点呢,10w不够?1000w如何?
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
using namespace std;
const int N = 100;
const double inf = 10000000.0;
const double eps = 1e-8;
int people_num
;
struct node
{
double x,y;
}position
;
int n;
double dis(int i,double x,double y)
{
return sqrt((x - position[i].x) * (x - position[i].x) + (y - position[i].y) * (y - position[i].y));
}
double cal(double x,double y)
{
double ret = 0;
for(int i = 1;i <= n;i ++)
ret = ret + dis(i,x,y) * people_num[i];
return ret;
}
int main()
{
int i;
freopen("data.in","r",stdin);
scanf("%d",&n);
double minx,miny,maxy,maxx;
minx = miny = inf;
maxx = maxy = -inf;
for(i = 1;i <= n;i ++)
{
scanf("%lf%lf",&position[i].x,&position[i].y);
if(position[i].x > maxx)
maxx = position[i].x;
if(position[i].x < minx)
minx = position[i].x;
if(position[i].y > maxy)
maxy = position[i].y;
if(position[i].y < miny)
miny = position[i].y;
}
for(i = 1;i <= n;i ++)
scanf("%d",&people_num[i]);
maxx *= 100;
maxy *= 100;
minx *= 100;
miny *= 100;
int lenx = ceil(maxx - minx);
int leny = ceil(maxy - miny);
double ansx,ansy,Max;
Max = inf;
srand((unsigned)time(NULL));
for(i = 1;i <= 100000;i ++)
{
double tmpx = rand()%lenx + minx;
double tmpy = rand()%leny + miny;
tmpx = tmpx / 100;
tmpy = tmpy / 100;
double tmp = cal(tmpx,tmpy);
if(tmp - Max < eps)
{
ansx = tmpx;
ansy = tmpy;
Max = tmp;
}
}
printf("便利店的地址为:(%.2lf,%.2lf)\n",ansx,ansy);
return 0;
}
/*
便利店地址:(16.53,27.43)
最优值:5146.85
*/
随机算法,你值得拥有哟嚯嚯嚯嚯~
相关文章推荐
- 2013数据结构课程设计之便利店选址(三分法)
- 便利店选址
- 2013数据结构课程设计之便利店选址(暴力枚举和随机函数两种做法)
- 便利店选址问题(Java version)
- 便利店选址问题
- 2013数据结构课程设计之便利店选址(暴力枚举或随机函数或三分)
- 成功开店选址三大法宝---专家为你支招
- 二维带权邮局位置(选址)问题(分别求横坐标、纵坐标的带权中位数)C++实现
- 输油管道问题和邮局选址问题
- 云数据中心选址PK:微软第一,IBM第二,谷歌最少
- 【hihoCoder】基站选址
- hihocoder 1150 基站选址
- Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能
- 【NOIP2014TG】无线网络发射器选址
- 移动支付“攻陷”超市便利店
- 发射器选址
- NOIP 2014 提高组 无线网路发射器选址
- SSL1760商店选址问题
- BZOJ1835 [ZJOI2010]base 基站选址
- dp斜率优化 锯木厂选址(CEOI 2003)题解