2018 3 26集訓 yja 偽模擬退火

2022-08-21 05:42:14 字數 1211 閱讀 6880

在平面上找 n 個點, 要求這 n 個點離原點的距離分別為 $r_1,r_2, \cdots r_rn$. 最大化這 n 個點構成的凸包面積, 凸包上的點的順序任意。

注意點不一定全都要在凸包上。

$n \leq 8,r_i \leq 1000$

正解是拉格朗日乘數法。

然而作為乙隻蒟蒻,當然是不會這種巧妙的操作的。

那就亂搞吧!

考慮使用模擬退火演算法。

初始給每個節點隨機乙個相對於原點的角度,並計算它們構成的凸包面積。

設定初始溫度為$\pi$(角度為弧度制),並進行退火。

每次從所有點中隨機選擇乙個點,對其角度加上或減去溫度乘上乙個在$(0,1)$範圍內隨機的實數,計算此時的答案。

若更優,則應用這次修改,否則不作出修改。

隨機$10$次左右即可穩定得到最優解~

說這是偽模擬退火的原因是,模擬退火事實上還會根據溫度一定概率接受一次錯誤的修改,而實測這樣的效果並不是特別優。

**:

#includeusing namespace std;

typedef double db;

typedef pairpr;

const int n=19;

const db eps=1e-8;

const db pi=acos(-1);

const db mint=1e-7;

#define x first

#define y second

int n,stk[n],rr[n];

db r[n];

db ang[n],ans=0.0;

pr p[n];

inline bool cmp(pr a,pr b)

db ret=0;

for(int i=1;imint)

t*=0.994;

} ans=max(ans,cans);

}inline int spj()

int main()

for(int i=2;i<=n;i++)

if(r[i]!=r[i-1])

goto hell;

return spj();

hell:;

int t=200;

while(t--)

work();

printf("%.8f\n",ans);

return 0;

}

6 28集訓 集訓模擬賽2

第一題 n只有4,直接暴力 第二題 tarjan縮點之後跑乙個最長路 第三題 dp 第四題 思維量較大 n 的範圍很小,所以我們考慮狀壓dp 我們設 f i j k m 為第一行的狀態為 i 第二行的狀態為 j 第三行的狀態為 k 第四題的狀態為 m 所需要的最小步數 所以我們暴力列舉6重迴圈,時間...

8 1 集訓日記

今天看了有關容斥原理的幾篇部落格。容斥原理的基本思想是 先不考慮重疊的情況,把所有物件的數目求出,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複。首先是乙個經典的互素問題 hdoj 4135 co prime 題目大意是 給定a,b,n,求區間 a,b 中與n互素的數的個數。思...

8 4 集訓日記

今天看了有關組合數學的一些內容。首先,排列組合的 為 ll c ll n,ll m ll a ll n,ll m 一道組合數學 位運算的題,hdoj4810 wall painting 題目大意 有一位畫家,有 n種顏料,給出 n種顏料的值。然後在1到 n天中,他每天都會選擇相應天數的顏料數進行混合...