您的位置:首页 > 其它

便利店选址

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
*/

随机算法,你值得拥有哟嚯嚯嚯嚯~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  随机 乱搞