發表文章

目前顯示的是有「模擬退火」標籤的文章

[Codeforces] 782B. The Meeting Place Cannot Be Changed

題目連結: http://codeforces.com/problemset/problem/782/B 其實本題是對答案二分搜,驗證方法是當你把時間乘上速率後可以得到每個人最遠走到哪,看有沒有交集就知道解是否合法,不過本題有更無腦的方式,那就是對集合點模擬退火(其實是因為我當時看一眼就想到這個做法就沒去想正解了XD #include <bits/stdc++.h> using namespace std; #define N 60000 double pos[N+5], speed[N+5]; int n; inline double getY(double x); int main(){ scanf("%d",&n); for(int i=0;i<n;i++)scanf("%lf",&pos[i]); for(int i=0;i<n;i++)scanf("%lf",&speed[i]); double rr=*max_element(pos,pos+n); double ll=*min_element(pos,pos+n); default_random_engine rEng(time(NULL)); uniform_real_distribution<double> Range(-1,1); uniform_real_distribution<double> expR(0,1); auto Random=bind(Range,rEng); auto expRand=bind(expR,rEng); int step=0; double pace=rr-ll, mini=0.95; double x=max(min(Random()*pace+ll, rr), ll), y=getY(x); while(pace>=1e-7){ ...

[TIOJ] 1882. pC. 最暖的冬天

題目連結: http://tioj.infor.org/problems/1882 本題是要求一堆二次函數取min疊加起來後的最大值,因為二次函數疊加起來後其實斜率還是有單調性,因此可以三分搜出答案,不過我不太喜歡寫三分搜,因此就寫了個模擬退火(當初是培訓時有人提了這鬼東東ww),研究了一下發現滿有趣的,簡單來說就是隨邊挑個起點,走走看如果比較好就走,如果比較差就用$e^{\Delta y \times t}$ 來判斷是否要走下去(這裡的t指的是步數,原本是用溫度),不過因為本題的斜率有單調性,所以不需要往下(這好像又叫爬山法)。此外我裡面還用了C++的random,發現可調的參數真的變多了,但相對的用起來也沒那麼無腦了XD #include <bits/stdc++.h> using namespace std; #define endl '\n' struct wow{ double a,b,c; }; vector<wow> func; inline double getY(double x); int main(){ cin.tie(NULL);ios_base::sync_with_stdio(); default_random_engine rGen; uniform_real_distribution<double> rForm(-1,1); auto random = bind(rForm,rGen); int n; cin>>n; func.resize(n); for(int i=0;i<n;i++) cin>>func[i].a>>func[i].b>>func[i].c; uniform_real_distribution<double> inipos(0,90); double x=inipos(rGen); double y=getY(x); doubl...