題目:在矩形中有若干個點,求乙個點使得所有點到該點的最小距離最大。
思路:這個是2023年顧研**上的例題,可以比較簡單地用模擬退火演算法求解。所謂模擬退火就是先隨機出若干個點,然後以某一特定步長嘗試周圍的解,而後逐漸縮小步長,知道步長小於特定值,跳出。這個演算法雖然簡單易行,但是其正確性並不是非常有保障,(不合理的隨機方法可能會降低到達正確解的概率),而且幾個主要引數的選取也主要看經驗,畢竟對於乙個隨機化演算法做出像**中一樣的嚴格評估還是比較困難的。。。。所以說即使實現完全正確,能否通過有時也是玄學的領域。。。。。尤其對於不太適合隨機化的題。
ps:poj不能用time,一呼叫就re,查了乙個多小時錯才發現。。。。以後不用time了。。。
/*view code* @author: cwind
* * 蒟蒻只能做幾個水題。。
*///
#pragma comment(linker, "/stack:102400000,102400000")
#include #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ios std::ios::sync_with_stdio (false);std::cin.tie(0)
#define pb push_back
#define pb pop_back
#define bk back()
#define fs first
#define se second
#define sq(x) (x)*(x)
#define eps (1e-3)
#define iinf (1<<29)
#define linf (1ll<<59)
#define finf (1e100)
#define inf 1000000000
const
double pi=acos(-1.0
);typedef
long
long
ll;typedef unsigned
long
long
ull;
typedef pair
pii;
typedef pair
p;inline
double dis(double x1,double y1,double x2,double
y2)int
t;int
x,y,m;
const
int l=30
;double zx[1005],zy[1005
];int
main()
for(int i=0;i<30;i++)
}while(delta>eps)
if(md>d[i])}}
delta*=0.8
; }
double ans=0
;
int ansp=0
;
for(int i=0;i<30;i++)
}printf(
"the safest point is (%.1f, %.1f).\n
",pos[ansp][0],pos[ansp][1
]); }
return0;
}
poj2539
題目:求使得一點到其他各點距離之和最小的點。
思路:和上題一樣的寫法,很順利的1a了。。
/*view code* @author: cwind
* * 蒟蒻只能做幾個水題。。
*///
#pragma comment(linker, "/stack:102400000,102400000")
#include #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ios std::ios::sync_with_stdio (false);std::cin.tie(0)
#define pb push_back
#define pb pop_back
#define bk back()
#define fs first
#define se second
#define sq(x) (x)*(x)
#define eps (1e-3)
#define iinf (1<<29)
#define linf (1ll<<59)
#define finf (1e100)
#define inf 1000000000
const
double pi=acos(-1.0
);typedef
long
long
ll;typedef unsigned
long
long
ull;
typedef pair
pii;
typedef pair
p;inline
double dis(double x1,double y1,double x2,double
y2)const
int maxp=50
;const
int maxx=10000
;int
n;double c[105][2
];double p[maxp][2
],d[maxp];
double delta=5000
;int l=30
;double a=0.8
;int
main()
for(int i=0;i)
d[i]=sdis;
}while(delta>eps)
if(sdis}}
delta*=a;
}double ans=1e100;
for(int i=0;i)
printf(
"%.0f
",ans);
return0;
}
poj 2420 poj1379 模擬退火
具體模擬退火的原理可參考 模擬退火可用於一些 精度 要求不是很高的題目。比如取答案的0.1,或者沒有小數點 poj2420 題意 給定n個點,找到乙個點,使得n個點到這個點的距離和最小 模擬退火法 模擬退火的過程 1 確定生成點的範圍,初設為矩形,在這個範圍內生成num個點 num自定 2 確定最高...
poj1379 模擬退火
poj 1379 題意 給定n個點,你需要在給定矩形範圍內找到乙個點,使得它到這n個點的距離的最小值最大。一開始是用的顧研的方法,但總是ac不了,聽盾哥說他那個有問題。正確的演算法流程應該是 初始化 初始溫度de 充分大 初始p個並行解狀態s 演算法迭代的起點 失敗次數上限l,接受引數x,衰變係數k...
poj 1379 模擬退火
題意 給定n個點和範圍,在範圍內找到乙個點,使得n個點到這個點的最小距離最大 模擬退火法 模擬退火的過程 1 找到這些點所在的範圍,用兩個點框定 中e1,e2兩個點 2 在這個範圍內生成num個點 num自定 3 對於每個生成的點i,在其周圍生成num個點,一旦有點優於i,則替換。4 縮小範圍d,若...