当前位置: 首页 > news >正文

模拟退火大法

这个算法本身就不多讲了,感觉很暴力。

Luogu P5928

#include<bits/stdc++.h>
#define int long long
using namespace std;
const double eps=1e-3,delta=0.999;
const int N=103; 
int  n,p;
struct node{int a,b,c,w;bitset<N>v;
}e[104];
struct book{int x,y;
}z[103];
int Ans=1e18;
bitset<N>tmp,vis;
int calc(){int res=0;for(int i=1;i<=p;i++) vis[i]=0;for(int i=1;i<=n;i++){if(tmp[i]) vis|=e[i].v,res+=e[i].w;}for(int i=1;i<=p;i++) if(!vis[i]) return 2e9;return res;
}
void solve(){double T=2333;int ans=calc(),now=ans;while(T>eps){int x=rand()%n+1;tmp[x]=!tmp[x];int k=calc();if(k<ans) ans=k;if(k<now||exp((double)(now-k)/T)>(double)rand()/INT_MAX) now=k;else tmp[x]=!tmp[x];T*=delta; }Ans=min(Ans,ans);
}
int a,b,c,w;
signed main(){srand(time(NULL));cin>>n>>p;for(int i=1;i<=n;i++){cin>>a>>b>>c>>w;e[i]={a,b,c,w,bitset<N>{}};}for(int i=1;i<=p;i++){cin>>z[i].x>>z[i].y;}for(int i=1;i<=n;i++){tmp[i]=1;for(int j=1;j<=p;j++){if(z[j].x*e[i].a+z[j].y*e[i].b<=e[i].c){e[i].v[j]=1;}}}if(calc()==2e9){cout<<"-1";return 0;}double timer=clock();while(clock()-timer<=CLOCKS_PER_SEC*0.98) solve();cout<<Ans;
}

Luogu P1337

#include<bits/stdc++.h>
using namespace std;
double x_ans,y_ans,ans;
int n;
double delta=0.999,Min=1e-14;
struct node{int x,y,w;
}z[3004];
unsigned long long seed=19491001;
double get(double x,double y){double dx=0,dy=0,res=0;for(int i=1;i<=n;i++){dx=x-z[i].x;dy=y-z[i].y;res+=sqrt(dx*dx+dy*dy)*z[i].w;}return res;
}
void solve(){double T=3100;while(T>Min){double x=x_ans+(rand()*2-RAND_MAX)*T;double y=y_ans+(rand()*2-RAND_MAX)*T;double w=get(x,y);if(w<ans){x_ans=x;y_ans=y;ans=w;}else if(exp((double)(ans-w)/T)>(double)rand()/RAND_MAX){x_ans=x;y_ans=y;}T*=delta;}
}
signed main(){ios::sync_with_stdio(false);srand(seed);cin>>n;for(int i=1;i<=n;i++){cin>>z[i].x>>z[i].y>>z[i].w;x_ans+=z[i].w;y_ans+=z[i].y;}x_ans/=n;y_ans/=n;ans=get(x_ans,y_ans);// double timer=clock();solve();solve();solve();solve();// solve();printf("%.3lf %.3lf",x_ans,y_ans);
}

Luogu P2210

#include<bits/stdc++.h>
using namespace std;
int n;
int x,y,w;
int f[103][4];
int pos[1004];
const double T_min=1e-5;
const double delta=0.999;
int GET(){int s=0;for(int i=1;i<=n;i++){for(int j=0;j<3;j++){s+=abs(pos[i]-pos[f[i][j]]);}}return s;
}
int ans;
void solve(){double T=30000;while(T>T_min){x=rand()%n+1;y=rand()%n+1;//    while(x==y) y=rand()%n+1;swap(pos[x],pos[y]);int k=GET();if(ans>k){ans=k;}else{if(exp((double)(ans-k)/T)<=(double)rand()/INT_MAX){swap(pos[x],pos[y]);} }T*=delta;}
}
signed main(){cin>>n;for(int i=1;i<=n;i++){for(int j=0;j<3;j++){cin>>f[i][j];}pos[i]=i;}ans=GET();// cout<<ans<<endl;int timer=clock();while(clock()-timer<=CLOCKS_PER_SEC*0.98) solve();cout<<ans/2;
}
http://www.sczhlp.com/news/8237/

相关文章:

  • DAY11 函数对象 函数的嵌套 名称空间和作用域 作用域修改关键字
  • Python入门学习(九)Python的高级语法与用法(一)枚举
  • 进程间通信
  • GAS_Aura-Aura Player Controller
  • LP-BT100蓝牙耳机
  • OpenTelemetry概述
  • cocos2dx项目中遇到的spine问题
  • LGP11364 [NOIP 2024] 树上查询 学习笔记
  • 严格WQS二分
  • 2025 暑期 mx 集训 7.21
  • 8月8号
  • GPT-5 API 请求参数调整,避坑指南(汇总)
  • 题解:CF2048F Kevin and Math Class
  • gem5流程学习-1
  • SPI详细讲解+W25Q128验证
  • 【自学嵌入式:stm32单片机】蜂鸣器
  • 带 PVC 的 Pod 提交后时序事件
  • C#自学笔记:匿名函数与Lambda表达式
  • 如何高效率使用 Cursor ?
  • 注意力头
  • 8月8日
  • 一键上云不是梦!Apache Dubbo 发布微服务集群部署与全新控制台
  • 安装libretranslate
  • 解决 Vue 路由在 IIS 中的 404 问题
  • 位置嵌入
  • threejs之灯光不跟随OrbitControls控制器旋转
  • MAC在Docker上部署Ollama详细教程
  • 8月8日随笔
  • 场景题——高并发
  • 权重衰减系数