日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[HAOI2006]均分数据

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HAOI2006]均分数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題解

今天下午剛學(xué)了模擬退火

借這個(gè)題來總結(jié)下模擬退火的要注意的問題吧

1 : \(eps\)不要設(shè)的太大

2 : 初溫\(T\)在2000左右就差不多可以了

3 : 注意題目要求是要求最大值還是最小值,當(dāng)x<0時(shí)\(exp(x)\)的取值范圍才是\(0~1\)

4 : 可以在退完火以后再單獨(dú)從當(dāng)前最優(yōu)答案下進(jìn)行微調(diào)

5 : 可以進(jìn)行多次退火

然后這題就是每次退火就是隨機(jī)交換序列中的兩個(gè)數(shù),對(duì)序列DP一下就好了

題解

#include<ctime> #include<cmath> #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> const int M = 25 ; const int N = 8 ; const double INF = 1e50 ; const double EPS = 1e-3 ; using namespace std ;int n , m ; int val[M] , e[M] ; double f[N][M] , p[M] , Sum[M] ; double bax , Ans = INF ; inline double Rand() {return (double)((rand() % 101) / 100.0) ; } inline double F() {for(int i = 0 ; i <= m ; i ++)for(int j = 0 ; j <= n ; j ++) f[i][j] = INF ;f[0][0] = 0 ;for(int i = 1 ; i <= n ; i ++) Sum[i] = Sum[i - 1] + p[i] ;for(int i = 1 ; i <= m ; i ++)for(int j = i ; j <= n ; j ++)for(int k = i - 1 ; k < j ; k ++)f[i][j] = min(f[i][j] , f[i - 1][k] + (Sum[j] - Sum[k] - bax) * (Sum[j] - Sum[k] - bax)) ;if(f[m][n] < Ans) {Ans = f[m][n] ;for(int i = 1 ; i <= n ; i ++) e[i] = p[i] ;}return f[m][n] ; }inline void Solve() {for(int i = 1 ; i <= n ; i ++) p[i] = e[i] ;double T = 2000 , W = 0.98 ;double NowAns , PreAns , dlt ;while(T > EPS) {PreAns = F() ;int a = rand() % n + 1 , b = rand() % n + 1 ;while(a == b) b = rand() % n + 1 ;swap(p[a], p[b]) ;NowAns = F() ; dlt = NowAns - PreAns ;if(exp(-dlt / T) > Rand()) ;else swap(p[a] , p[b]) ;T *= W ;}for(int i = 1 ; i <= 10000 ; i ++) {int a = rand() % n + 1 , b = rand() % n + 1 ;while(a == b) b = rand() % n + 1 ;swap(p[a] , p[b]) ;F() ;swap(p[a] , p[b]) ;} } int main() {srand(time(0)) ;cin >> n >> m ;for(int i = 1 ; i <= n ; i ++) {cin >> val[i] ;bax += val[i] ;p[i] = val[i] ;}bax /= m ; F() ;int Times = 20 ; while(Times--) Solve() ;printf("%.2lf\n",sqrt(Ans / m)) ;return 0 ; }

轉(zhuǎn)載于:https://www.cnblogs.com/beretty/p/10071905.html

總結(jié)

以上是生活随笔為你收集整理的[HAOI2006]均分数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。