bzoj 4852 炸弹攻击

  • 二维平面上的最优解问题,模拟退火是一个较为优秀的近似算法.
  • 此题确定圆心后,便可 \(O(m)\) 算出收益,且最优解附近显然也较优,是连续变化的,可以直接模拟退火.
  • 小技巧:这里不同答案差值比较小,而温度比较高,可以乘上一个常数,降低选取差解的概率,即满足下式时转移.出处.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
struct v2{
double x,y;
v2(double x=0,double y=0):x(x),y(y) {}
v2 operator + (const v2 &rhs) const
{
return v2(x+rhs.x,y+rhs.y);
}
v2 operator / (const double &rhs) const
{
return v2(x/rhs,y/rhs);
}
v2 operator - (const v2 &rhs) const
{
return v2(x-rhs.x,y-rhs.y);
}
double operator * (const v2 &rhs) const
{
return x*rhs.y-y*rhs.x;
}
double modulus()
{
return sqrt(x*x+y*y);
}
};
const int MAXN=1e3+10;
int n,m;
double R;
struct Tur{
double r;
v2 pos;
}tur[MAXN];
v2 enemy[MAXN];
int dcmp(double x)
{
return fabs(x)<=(1e-8)?0:(x>0?1:-1);
}
int calc(v2 centre)
{
double r=R;
for(int i=1;i<=n;++i)
r=min(r,(centre-tur[i].pos).modulus()-tur[i].r);
int res=0;
for(int i=1;i<=m;++i)
if(dcmp((centre-enemy[i]).modulus()-r)<=0)
++res;
return res;
}
double rd()
{
return (double) rand() / RAND_MAX;
}
double randpos(double &x,double &y)
{
x=2*R*rd()-R;
y=2*R*rd()-R;
}
const double dt=0.998;
const double eps=1e-2;
int cnt=0;
int SA(double x,double y)
{
int res=calc(v2(x,y));
int cur=res;
double T=R;
while(T>eps)
{
double nt=T+0.1;
double nx=x+ (2*nt)*rd()-nt,ny=y+(2*nt)*rd()-nt;
int nans=calc(v2(nx,ny));
if(nans>res || exp(1e4*(nans-cur)/T)>rd())
{
x=nx;
y=ny;
cur=nans;
}
res=max(res,cur);
T*=dt;
}
return res;
}
int main()
{
srand(19260817);
scanf("%d%d%lf",&n,&m,&R);
for(int i=1;i<=n;++i)
scanf("%lf%lf%lf",&tur[i].pos.x,&tur[i].pos.y,&tur[i].r);
for(int i=1;i<=m;++i)
scanf("%lf%lf",&enemy[i].x,&enemy[i].y);
int ans=0;
for(int i=1;i<=20;++i)
{
double x,y;
randpos(x,y);
ans=max(ans,SA(x,y));
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文
  2. java 对象输入输出流
  3. 一次意外的X锁不阻塞问题
  4. Chinese culture
  5. 夺命雷公狗---DEDECMS----2快速入门之玩转dede四大表之间的关系
  6. [改善Java代码]注意方法中传递的参数要求(replaceAll和replace的区别)
  7. MSSQL AlwaysOn中的“主角色中的连接”和“可读辅助副本”初探
  8. java final 和instanceof 关键字
  9. 9种CSS3 blend模式制作的鼠标滑过图片标题特效
  10. CentOS下Samba服务器的配置
  11. Eclipse中如何显示代码行
  12. 处处留心皆学问——由“display:inline-block;”导致的间距引发的思考。
  13. 前端教程(1)http协议的深刻理解
  14. LOJ-10092(最大半连通子图)
  15. LODOP暂存、应用、复原 按钮的区别
  16. Spring Boot 2.0(二):Spring Boot 开源软件都有哪些?(转)
  17. (转)python之from_bytes、to_bytes
  18. Nginx的rewrite(地址重定向)剖析
  19. Mysql创建用户并授权以及开启远程访问
  20. java用String类的toUpperCase()和toLowerCase()方法转字符串的大小写

热门文章

  1. Extjs 分页多选的实现
  2. Visual Studio 2013 Ultimate &amp; IIS Express 8.0 错误 [iisexpress.exe”已退出,返回值为 -1073741816 (0xc0000008)] 解决方法
  3. Interleaving String,交叉字符串,动态规划
  4. Centos7.2 FastDFS_V5.05 集群的安装与配置1
  5. HttpServletResponse response详解
  6. IE与DOM的事件监听
  7. byte[]与各种数据类型互相转换示例
  8. 21.线程池ThreadPoolExecutor实现原理
  9. 大数据位图法(无重复排序,重复排序,去重复排序,数据压缩)之Java实现
  10. LA-4255 Guess (拓扑排序+构造)