便利店选址
題目描述:
某小區(qū)決定在小區(qū)內(nèi)部建一家便利店,現(xiàn)小區(qū)內(nèi)部共有八棟樓,它們的地理坐標(biāo)分別為:(10,20)(30,34)(19,25)(38,49.1)(9,38.1)(2,34)(5,8) (29,48)。同時(shí),其中的住戶人數(shù)分別為:30,45,28,8,36,16,78,56。為了方便更多的住戶購物,要求實(shí)現(xiàn)總體最優(yōu),請問便利店應(yīng)該建立在哪里?
【提示】
1)便利店無論選址何處,八棟樓的居民均可直接到達(dá),即八棟樓與便利店均相鄰,且距離為直線距離;
2)八棟樓的居民人數(shù)為權(quán)重,應(yīng)該方便大多數(shù)人,實(shí)現(xiàn)總體最優(yōu)。
感覺好玩的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題,雖然沒發(fā)現(xiàn)這題跟數(shù)據(jù)結(jié)構(gòu)有什么關(guān)系。看到這題想了好久沒什么思路,沒發(fā)現(xiàn)什么數(shù)據(jù)結(jié)構(gòu)可以解這題。枚舉點(diǎn)的話,也沒有什么好的策略(其實(shí)也蠻麻煩)。前幾天打了一場warmup,有道題比賽的時(shí)候想了好久的,一直以為是搜索,但是數(shù)據(jù)量太大也沒敢寫。比賽完了發(fā)現(xiàn)那題竟然是用隨機(jī)算法過的。瞬間感覺隨機(jī)算法好強(qiáng)大的樣子。然后就想到了這題,隨機(jī)算法太適合不過了。與其苦苦想枚舉點(diǎn)的策略,還不如隨機(jī)打10w個(gè)點(diǎn)呢,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[N];
struct node
{
double x,y;
}position[N];
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)
",ansx,ansy);
return 0;
}
/*
便利店地址:(16.53,27.43)
最優(yōu)值:5146.85
*/
隨機(jī)算法,你值得擁有喲嚯嚯嚯嚯~
總結(jié)
- 上一篇: 刺激战场国际服僵尸模式怎么玩
- 下一篇: 如何使用飞秋FeiQ实现两电脑通信(或传