CF175E Power Defence

题意

一个塔防游戏:给定一个无限长的数轴,一个无限血的敌人要从正无穷走到负无穷。你的任务是放置三种塔,包含两种攻击塔和一种寒冰塔,使得敌人受到的伤害最大。

其中,每种塔的攻击半径可能不同,每种攻击塔的攻击力也可能不同。而寒冰塔没有攻击力,它的作用是使范围内敌人的速度减速,即一段区间若有\(k\)个寒冰塔覆盖,敌人速度变为\(\frac{1}{k+1}\)。

敌人初始速度为1格每秒,攻击塔的伤害值也是以秒计算的。

思路

首先有几个基本结论:

  • 若没有寒冰塔,整场游戏答案固定。
  • 若有寒冰塔,让所有塔挤在一起必不会更劣。这里对挤在一起的定义是:所有塔至少有一端上下对齐,且左右两端距离最大不超过\(\lceil \frac{n}{2}\rceil\)。
  • 寒冰塔的能力实际上是将范围内基础伤害增加一倍。注意这里的伤害是忽略其他寒冰塔效果的。

发现序列长度很短,排列的方式也很有限,于是我们就有了一个大胆的想法:模拟退火。

然后便是裸的模拟退火算法:随机出来两个位置进行交换,统计答案,若答案大于当前答案,接受之;否则以当前温度的概率接受之。参数调整得好的话多做几次便可。

然后是统计答案。我有一个\(n^2\)的想法:扫描序列,每扫到一个寒冰塔就再次扫描整个序列的攻击塔,计算出两个塔间相交的范围乘上该塔攻击力加入答案即可,当然最后别忘了加上不计算寒冰塔的基础伤害。正确性也显然,因为显然寒冰塔的贡献是可以对于每个其他攻击塔单独计算的。

具体实现我耍了个小聪明:将所有炮塔放进一个数组中,这样交换的时候就不用分上下位置了。统计答案的时候计算出该塔的实际位置就行。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
#include<ctime>
#define T 10000
#define eps 0.99
#define kb 1.38e-23
#define endt 1e-12
#define INF 1e19
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=45;
int n1,n2,n3,d1,d2,n,a[maxn],m;
double r1,r2,r3,res,ans;
inline double getsum(){
double sum=0;
for(int i=1;i<=n;i++){
if(a[i]!=3)continue;
int x=i;
if(x>m)x-=m;
double L3=x-r3,R3=x+r3;
for(int j=1;j<=n;j++){
if(a[j]==3)continue;
int y=j,t=a[j];
if(y>m)y-=m;
if(t==1){
double L1=y-r1,R1=y+r1;
sum+=max(0.0,d1*(min(R1,R3)-max(L1,L3)));
}else if(t==2){
double L2=y-r2,R2=y+r2;
sum+=max(0.0,d2*(min(R2,R3)-max(L2,L3)));
}
}
}
return res+sum;
}
inline void solve()
{
double t=T;
double ans=0;
while(t>endt)
{
int xx=rand()%n+1,yy=rand()%n+1;
while(a[xx]==a[yy])xx=rand()%n+1,yy=rand()%n+1;
swap(a[xx],a[yy]);
double zp=getsum();
if(zp>ans){
ans=zp;
star::ans=max(star::ans,ans);
}else if(rand()<exp((ans-zp)/t/kb) * RAND_MAX)swap(a[xx],a[yy]);
else ans=zp;
t*=eps;
}
}
inline void work(){
n1=read(),n2=read(),n3=read();
r1=read();
r1=sqrt(r1*r1-1);
r2=read();
r2=sqrt(r2*r2-1);
r3=read();
r3=sqrt(r3*r3-1);
d1=read(),d2=read();
res=2*n1*r1*d1+2*n2*r2*d2;
if(n3==0)return (void)printf("%.10lf",res);
n=n1+n2+n3;
for(int i=1;i<=n;i++)
if(n1) a[i]=1,n1--;
else if(n2) a[i]=2,n2--;
else if(n3) a[i]=3,n3--;
m=n/2+1;
n=m*2;
random_shuffle(a+1,a+1+n);
srand(time(0));
// while((double)clock()/CLOCKS_PER_SEC<2.7)
for(int i=1;i<=100;i++)
solve();
printf("%.10lf\n",ans);
}
}
signed main(){
star::work();
return 0;
}

总结

这题正解是DP,爆搜也能过。

codeforces的题目,如果我现场写模拟退火的话一定当场去世。毕竟我因为一些奇怪的原因交了好多回。

所以骗骗分还是可以的

by ysr

UPD:2020.12.29

发现这个好像是个爬山

CF175E Power Defence的更多相关文章

  1. PatentTips - Fast awake from low power mode

    BACKGROUND Electronic devices, such as electronic book readers ("eBook reader devices"), c ...

  2. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  3. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  4. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验

    Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...

  5. Power BI官方视频(3) Power BI Desktop 8月份更新功能概述

    Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...

  6. 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库

    说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...

  7. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  8. 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???

    在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...

  9. 免费的精品: Productivity Power Tools 动画演示

    Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...

随机推荐

  1. python+selenium_鼠标事件

    引言--在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到右击.双击.拖动等操作,这些操作包含在ActionChains类中. 一.ActionChains类中鼠标操作 ...

  2. Redis系列(四):地理信息

    除了Bitmaps和HyperLogLog,Redis还提供了关于地理空间的相关操作,主要是经纬度.Redis提供的地理信息操作是有误差的,最大误差可能会达到5%.Redis提供的Geo的操作如下: ...

  3. RabbitMQ由浅入深入门全总结(一)

    写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇Q PS: ...

  4. docker创建和使用mysql

    container和image是两种不同的概念,image即指存在的镜像,container指docker运行起来后image的实例. 当使用docker kill 把某个正在运行的实例kill掉之后 ...

  5. 撸了几天的sofa-tracer之后,我悟了!

    什么是分布式链路跟踪 简而言之,在分布式系统下,用于跟踪链路而衍生出的一项技术. 应用场景如下: 应用A,B,C,D,E 以一个层级关系依赖, 当用户向 应用A 发起请求,但是返回了个异常,为了排查这 ...

  6. 海康威视ISC平台的VUE二次开发接入实现

    第一步 取得ISC平台的appkey以及secret,以及安装ISC平台的主机IP,这一步至关重要!!! 第二步 由于目前我所在的公司项目前端的代码均由vue所实现,所以利用vue-cli创建一个最简 ...

  7. 『无为则无心』Python基础 — 13、Python流程控制语句(条件语句)

    目录 1.流程控制基本概念 2.选择结构(条件语句) (1)条件语句概念 (2)if语句语法 (3)if...else...语句 (4)多重判断 (5)if语句嵌套 3.应用:猜拳游戏 4.三元运算符 ...

  8. Nexus3搭建Docker等私服

    0.目的 docker私有仓库的搭建,方便后期的CI/CD dotnetcore项目sdk本地缓存,解决微软官方下载缓慢的问题 nuget私有仓库 等 1.环境情况 windows10 Docker ...

  9. Git&Gitlab开发流程与运维管理

    Git&Gitlab开发流程与运维管理 作者 刘畅 时间 2020-10-31 实验系统版本centos7.5 主机名称 ip地址 配置 安装软件 controlnode 172.16.1.1 ...

  10. GPU 高性能计算

    背景 近日忽然想到,在CPU类型的服务器即使给到足够的运算资源,与GPU类型的服务器做运算来讲仍然是相差甚远,而本人有一台闲置的AMD vega8集显的电脑.想要用来做计算,来探究其与CPU运算的差别 ...