题解

我冷静一下,话说如果去掉建筑和R的限制好像是模拟退火吧

然后开始写模拟退火了,起始点就随机一个敌人作为起始点

没对着数据写了一下获得了70pts,感到美滋滋

然后对着数据卡了很久……发现有个数据点似乎需要从初始温度小一点的情况开始跳,于是就10次从20000降温,10次从2000降温

AC啦

该题的AC率显著地下降了= =

代码

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define MAXN 100005
#define mo 99994711
#define pb push_back
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0};
struct Point {
db x,y;
Point() {}
Point(db _x,db _y) {x = _x;y = _y;}
friend Point operator + (const Point &a,const Point &b) {return Point(a.x + b.x,a.y + b.y);}
friend Point operator - (const Point &a,const Point &b) {return Point(a.x - b.x,a.y - b.y);}
friend Point operator * (const Point &a,const db &d) {return Point(a.x * d,a.y * d);}
friend Point operator / (const Point &a,const db &d) {return Point(a.x / d,a.y / d);}
friend db operator * (const Point &a,const Point &b) {return a.x * b.y - a.y * b.x;}
friend db dot(const Point &a,const Point &b) {return a.x * b.x + a.y * b.y;}
db norm() {return sqrt(x * x + y * y);}
}Enemy[1005];
struct circle {
Point O;db r;
}C[15];
u32 Rand() {
static u32 x = 20020421;
return x += x << 2 | 1;
}
db Rand_range() {
return (db)(Rand() % 10000) / 10000.0;
}
int N,M,ans;
db R;
void Init() {
read(N);read(M);scanf("%lf",&R);
db x,y,r;
for(int i = 1 ; i <= N ; ++i) {
scanf("%lf%lf%lf",&x,&y,&r);
C[i].O = Point(x,y);C[i].r = r;
}
for(int i = 1 ; i <= M ; ++i) {
scanf("%lf%lf",&x,&y);
Enemy[i] = Point(x,y);
}
}
int Count(Point x) {
db r = R;
for(int i = 1 ; i <= N ; ++i) {
r = min(r,(C[i].O - x).norm() - C[i].r);
}
int cnt = 0;
for(int i = 1 ; i <= M ; ++i) {
if((Enemy[i] - x).norm() <= r + eps) ++cnt;
}
return cnt;
}
void Solve(int num) {
db T = num,delta = 0.99;
Point x = Enemy[Rand() % M + 1];
int tmp = 0;
while(T > 0.01) {
Point t;tmp = 0;
for(int i = 0 ; i <= 3 ; ++i) {
Point k = x + Point(T * dx[i],T * dy[i]);
int a = Count(k);
if(a > tmp) {t = k;tmp = a;}
}
if(tmp > ans) {x = t;ans = tmp;}
else if(exp((ans - tmp) * 0.1 / T) > Rand_range()) x = t;
T *= delta;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
ans = 1;
int cnt = 10;
while(cnt--) Solve(20000);
cnt = 10;
while(cnt--) Solve(2000);
out(ans);enter;
return 0;
}

【LOJ】#2076. 「JSOI2016」炸弹攻击的更多相关文章

  1. loj#2076. 「JSOI2016」炸弹攻击 模拟退火

    目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...

  2. LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)

    题面 传送门 题解 退火就好了 记得因为答案比较小,但是温度比较高,所以在算\(\exp\)的时候最好把相差的点数乘上一个常数来让选取更劣解的概率降低 话虽如此然而我自己打的退火答案永远是\(0\)- ...

  3. [LOJ 2082] 「JSOI2016」炸弹攻击 2

    [LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...

  4. LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)

    题面 传送门 题解 我们枚举一下发射源,并把敌人和激光塔按极角排序,那么一组合法解就是两个极角之差不超过\(\pi\)且中间有敌人的三元组数,预处理一下前缀和然后用双指针就行了 //minamoto ...

  5. loj#2071. 「JSOI2016」最佳团体

    题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...

  6. 【LOJ】#2082. 「JSOI2016」炸弹攻击 2

    题解 想到n3发现思路有点卡住了 对于每个发射塔把激光塔和敌人按照极角排序,对于一个激光塔,和它转角不超过pi的激光塔中间夹的敌人总和就是答案 记录前缀和,用two-Points扫一下就行 代码 #i ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. MT【92】空间余弦定理解题

    评:学校常规课堂教学里很少讲到这个,有点可惜.

  2. [Swerc2014 C]Golf Bot

    题意:给你N个数字,每次利用这N个数字中最多两个数字进行加法运算,来得到目标中的M个数字. Solution: 我们先来看看多项式乘法:\(A(x)=\sum_{i=0}^{n-1}a_ix^i\), ...

  3. 使用Pypi镜像源加速第三方库的安装

    Pypi是个好东西,类似于yum和apt-get,安装第三方库相当的方便,头疼的一点就是Python的官方源服务器在国内访问的速度确实不咋滴,好在douban开放了一个国内的镜像源,速度杠杠的. 如果 ...

  4. 生成器 yield

    由于生成器的其中一种创建方式与列表推导式很相似,这里先说一下列表推导式. 列表推导式 列表推导式又叫列表生成式,官方叫做 list comprehension.顾名思义,这个是用来生成列表的. 用法: ...

  5. HDU 5574 Colorful Tree

    • 给出一棵树,每个点有初始的颜色,支持两种操作• 将一个点的子树染成一种给定颜色• 问一个点的子树里有几种不同的颜色 •

  6. 错误日志收集sentry的安装与简单使用

    通过官方文档https://docs.sentry.io/可以得知,安装服务有两种方式,一种是使用Python,这种方式个人感觉比较麻烦.于是选择了第二种方式:使用docker. 我是在Windows ...

  7. 线段树区间更新 lazy

    1. hdu1698 http://acm.hdu.edu.cn/showproblem.php?pid=1698 /* x y k x~y的值变为k */ #include <cstdio&g ...

  8. 改变 小程序 select 多选框 选中图片

    https://www.jianshu.com/p/11eb5b0bfe1a 注意 博客介绍的  在 wxss  backgroung-image 中引入小程序内图片是不可的,传到cdn上才实现

  9. Tomcat权威指南-读书摘要系列9

    从源代码组建Tomcat 安装Apache Ant ant是make的开放源代码的替代品,而且是专门为java程序语言设计. Ant的最初用途是作为Tomcat的组建工具: 之后,Ant成为Java软 ...

  10. 数据结构(三)串---KMP模式匹配算法实现及优化

    KMP算法实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include ...