[bzoj1033] [ZJOI2008]杀蚂蚁 Big MoNI
这个模拟就不用说了吧......
注意事项(救命的):1.不能回原位 2.在可以打到target的塔打target的时候,其他打不到的继续打自己的(这是显然的事情只是当时已惘然) 3.如果游戏在某一秒结束,那么这一秒年龄不加 4.蚂蚁半径0.5 5.蚂蚁窝上不能有蚂蚁 6.HP别加爆,信息素别减爆 7.如果一只蚂蚁被卡了那么他也可能是被卡在蛋糕那里,也就是上一个死了,他被卡了,他就拿到了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
typedef long double LD;
LD Source_HP[];
const LD eps=1e-;
int Now_Rank=,Rank_In;
int Information[][];
int pos[][];
int s,d,r;
int target;
struct Ant
{
int S_HP,HP,x,y,old,id,X,Y;
}ant[];
struct Tor
{
int x,y;
}tor[];
int t,T,n,m;
int ant_now;
int go1[]={,,,-};
int go2[]={,,-,};
inline void Read()
{
n=read(),m=read(),s=read(),d=read(),r=read();
for(int i=;i<=s;i++)tor[i].x=read(),tor[i].y=read(),pos[tor[i].x][tor[i].y]=;
T=read();
Source_HP[]=4.0;
for(int i=;i<;i++)Source_HP[i]=Source_HP[i-]*1.1;
}
inline int SQR(int x)
{
return x*x;
}
inline LD Sqr(LD x)
{
return x*x;
}
int main()
{
Read();
while(t<T)
{
++t;
if(ant_now<&&(pos[][]==))
{
++ant_now;
ant[ant_now].x=ant[ant_now].y=ant[ant_now].old=;
ant[ant_now].X=ant[ant_now].Y=-;
pos[][]=;
ant[ant_now].S_HP=ant[ant_now].HP=(int)(Source_HP[Now_Rank]);
ant[ant_now].id=Now_Rank;
++Rank_In;
if(Rank_In==)
Rank_In=,++Now_Rank;
}
for(int i=;i<=ant_now;i++)Information[ant[i].x][ant[i].y]+=(i==target)?:;
for(int i=;i<=ant_now;i++)
{
int to=-,key=-;
if(ant[i].y!=m&&pos[ant[i].x+go1[]][ant[i].y+go2[]]==&&Information[ant[i].x+go1[]][ant[i].y+go2[]]>key&&((ant[i].x+go1[]==ant[i].X&&ant[i].y+go2[]==ant[i].Y)==))
to=,key=Information[ant[i].x+go1[]][ant[i].y+go2[]];
if(ant[i].x!=n&&pos[ant[i].x+go1[]][ant[i].y+go2[]]==&&Information[ant[i].x+go1[]][ant[i].y+go2[]]>key&&((ant[i].x+go1[]==ant[i].X&&ant[i].y+go2[]==ant[i].Y)==))
to=,key=Information[ant[i].x+go1[]][ant[i].y+go2[]];
if(ant[i].y!=&&pos[ant[i].x+go1[]][ant[i].y+go2[]]==&&Information[ant[i].x+go1[]][ant[i].y+go2[]]>key&&((ant[i].x+go1[]==ant[i].X&&ant[i].y+go2[]==ant[i].Y)==))
to=,key=Information[ant[i].x+go1[]][ant[i].y+go2[]];
if(ant[i].x!=&&pos[ant[i].x+go1[]][ant[i].y+go2[]]==&&Information[ant[i].x+go1[]][ant[i].y+go2[]]>key&&((ant[i].x+go1[]==ant[i].X&&ant[i].y+go2[]==ant[i].Y)==))
to=,key=Information[ant[i].x+go1[]][ant[i].y+go2[]];
if(to==-)
{
ant[i].X=ant[i].x;
ant[i].Y=ant[i].y;
if(target==&&ant[i].x==n&&ant[i].y==m)
target=i,ant[i].HP=(ant[i].HP+(ant[i].S_HP>>))>=ant[i].S_HP?ant[i].S_HP:(ant[i].HP+(ant[i].S_HP>>));
continue;
}
if((ant[i].old+)%==)
{
to=(to==)?:(to-);
while()
if(ant[i].x+go1[to]>=&&ant[i].x+go1[to]<=n&&ant[i].y+go2[to]>=&&ant[i].y+go2[to]<=m&&pos[ant[i].x+go1[to]][ant[i].y+go2[to]]==&&(ant[i].x+go1[to]==ant[i].X&&ant[i].y+go2[to]==ant[i].Y)==)
break;
else
to=(to==)?:(to-);
}
ant[i].X=ant[i].x;
ant[i].Y=ant[i].y;
pos[ant[i].x+go1[to]][ant[i].y+go2[to]]=;
pos[ant[i].x][ant[i].y]=;
if(target==&&ant[i].x+go1[to]==n&&ant[i].y+go2[to]==m)
target=i,ant[i].HP=(ant[i].HP+(ant[i].S_HP>>))>=ant[i].S_HP?ant[i].S_HP:(ant[i].HP+(ant[i].S_HP>>));
ant[i].x=ant[i].x+go1[to];
ant[i].y=ant[i].y+go2[to];
}
if(target)
{
for(int i=;i<=s;i++)
if(SQR(ant[target].x-tor[i].x)+SQR(ant[target].y-tor[i].y)<=SQR(r))
{
int a=ant[target].y-tor[i].y,b=tor[i].x-ant[target].x,c=tor[i].y*(ant[target].x-tor[i].x)+tor[i].x*(tor[i].y-ant[target].y);
if(b!=)
{
LD Ki=0.0-(LD)a/b,Bi=0.0-(LD)c/b;
int l=ant[target].x<tor[i].x?ant[target].x:tor[i].x,r=ant[target].x>tor[i].x?ant[target].x:tor[i].x;
for(int j=;j<=ant_now;j++)
if(SQR(a*ant[j].x+b*ant[j].y+c)<=0.25*(SQR(a)+SQR(b)))
{
LD A=(1.0+Sqr(Ki)),B=2.0*Ki*(Bi-ant[j].y)-2.0*ant[j].x,C=Sqr(Bi-ant[j].y)+Sqr(ant[j].x)-0.25;
LD X1=(-B-sqrt(Sqr(B)-4.0*A*C))/(2.0*A),X2=(-B+sqrt(Sqr(B)-4.0*A*C))/(2.0*A);
if((l-eps<=X1&&r+eps>=X1)||(l-eps<=X2&&r+eps>=X2))ant[j].HP-=d;
}
}
else
{
LD Ni=(LD)c/a;
int l=ant[target].y<tor[i].y?ant[target].y:tor[i].y,r=ant[target].y>tor[i].y?ant[target].y:tor[i].y;
for(int j=;j<=ant_now;j++)
if(SQR(a*ant[j].x+b*ant[j].y+c)<=0.25*(SQR(a)+SQR(b)))
{
LD A=1.0,B=-2.0*ant[j].y,C=Sqr(ant[j].y)+Sqr(Ni+ant[j].x)-0.25;
LD X1=(-B-sqrt(Sqr(B)-4.0*A*C))/(2.0*A),X2=(-B+sqrt(Sqr(B)-4.0*A*C))/(2.0*A);
if((l-eps<=X1&&r+eps>=X1)||(l-eps<=X2&&r+eps>=X2))ant[j].HP-=d;
}
}
}
else
{
int temp=target;
int dis=0x7fffffff;
for(int j=;j<=ant_now;j++)
if(SQR(ant[j].x-tor[i].x)+SQR(ant[j].y-tor[i].y)<dis)
target=j,dis=SQR(ant[j].x-tor[i].x)+SQR(ant[j].y-tor[i].y);
if(SQR(ant[target].x-tor[i].x)+SQR(ant[target].y-tor[i].y)<=SQR(r))
{
int a=ant[target].y-tor[i].y,b=tor[i].x-ant[target].x,c=tor[i].y*(ant[target].x-tor[i].x)+tor[i].x*(tor[i].y-ant[target].y);
if(b!=)
{
LD Ki=0.0-(LD)a/b,Bi=0.0-(LD)c/b;
int l=ant[target].x<tor[i].x?ant[target].x:tor[i].x,r=ant[target].x>tor[i].x?ant[target].x:tor[i].x;
for(int j=;j<=ant_now;j++)
if(SQR(a*ant[j].x+b*ant[j].y+c)<=0.25*(SQR(a)+SQR(b)))
{
LD A=(1.0+Sqr(Ki)),B=2.0*Ki*(Bi-ant[j].y)-2.0*ant[j].x,C=Sqr(Bi-ant[j].y)+Sqr(ant[j].x)-0.25;
LD X1=(-B-sqrt(Sqr(B)-4.0*A*C))/(2.0*A),X2=(-B+sqrt(Sqr(B)-4.0*A*C))/(2.0*A);
if((l-eps<=X1&&r+eps>=X1)||(l-eps<=X2&&r+eps>=X2))ant[j].HP-=d;
}
}
else
{
LD Ni=(LD)c/a;
int l=ant[target].y<tor[i].y?ant[target].y:tor[i].y,r=ant[target].y>tor[i].y?ant[target].y:tor[i].y;
for(int j=;j<=ant_now;j++)
if(SQR(a*ant[j].x+b*ant[j].y+c)<=0.25*(SQR(a)+SQR(b)))
{
LD A=1.0,B=-2.0*ant[j].y,C=Sqr(ant[j].y)+Sqr(Ni+ant[j].x)-0.25;
LD X1=(-B-sqrt(Sqr(B)-4.0*A*C))/(2.0*A),X2=(-B+sqrt(Sqr(B)-4.0*A*C))/(2.0*A);
if((l-eps<=X1&&r+eps>=X1)||(l-eps<=X2&&r+eps>=X2))ant[j].HP-=d;
}
}
}
target=temp;
}
}
else
{
for(int i=;i<=s;i++)
{
int dis=0x7fffffff;
for(int j=;j<=ant_now;j++)
if(SQR(ant[j].x-tor[i].x)+SQR(ant[j].y-tor[i].y)<dis)
target=j,dis=SQR(ant[j].x-tor[i].x)+SQR(ant[j].y-tor[i].y);
if(SQR(ant[target].x-tor[i].x)+SQR(ant[target].y-tor[i].y)<=SQR(r))
{
int a=ant[target].y-tor[i].y,b=tor[i].x-ant[target].x,c=tor[i].y*(ant[target].x-tor[i].x)+tor[i].x*(tor[i].y-ant[target].y);
if(b!=)
{
LD Ki=0.0-(LD)a/b,Bi=0.0-(LD)c/b;
int l=ant[target].x<tor[i].x?ant[target].x:tor[i].x,r=ant[target].x>tor[i].x?ant[target].x:tor[i].x;
for(int j=;j<=ant_now;j++)
if(SQR(a*ant[j].x+b*ant[j].y+c)<=0.25*(SQR(a)+SQR(b)))
{
LD A=(1.0+Sqr(Ki)),B=2.0*Ki*(Bi-ant[j].y)-2.0*ant[j].x,C=Sqr(Bi-ant[j].y)+Sqr(ant[j].x)-0.25;
LD X1=(-B-sqrt(Sqr(B)-4.0*A*C))/(2.0*A),X2=(-B+sqrt(Sqr(B)-4.0*A*C))/(2.0*A);
if((l-eps<=X1&&r+eps>=X1)||(l-eps<=X2&&r+eps>=X2))ant[j].HP-=d;
}
}
else
{
LD Ni=(LD)c/a;
int l=ant[target].y<tor[i].y?ant[target].y:tor[i].y,r=ant[target].y>tor[i].y?ant[target].y:tor[i].y;
for(int j=;j<=ant_now;j++)
if(SQR(a*ant[j].x+b*ant[j].y+c)<=0.25*(SQR(a)+SQR(b)))
{
LD A=1.0,B=-2.0*ant[j].y,C=Sqr(ant[j].y)+Sqr(Ni+ant[j].x)-0.25;
LD X1=(-B-sqrt(Sqr(B)-4.0*A*C))/(2.0*A),X2=(-B+sqrt(Sqr(B)-4.0*A*C))/(2.0*A);
if((l-eps<=X1&&r+eps>=X1)||(l-eps<=X2&&r+eps>=X2))ant[j].HP-=d;
}
}
}
target=;
}
}
bool god=;
int temp=ant_now;
ant_now=;
for(int i=;i<=temp;i++)
if(ant[i].HP<)
{
if(i==target) target=;
pos[ant[i].x][ant[i].y]=;
}
else
{
if(i==target)
{
if(ant[i].x==&&ant[i].y==) god=;
target=ant_now+;
}
ant[++ant_now]=ant[i];
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(Information[i][j])--Information[i][j];
if(god)
{
printf("Game over after %d seconds\n",t);
printf("%d\n",ant_now);
for(int i=;i<=ant_now;i++)
printf("%d %d %d %d %d\n",ant[i].old,ant[i].id,ant[i].HP,ant[i].x,ant[i].y);
return ;
}
for(int i=;i<=ant_now;i++)++ant[i].old;
}
printf("The game is going on\n");
printf("%d\n",ant_now);
for(int i=;i<=ant_now;i++)
printf("%d %d %d %d %d\n",ant[i].old,ant[i].id,ant[i].HP,ant[i].x,ant[i].y);
return ;
}
[bzoj1033] [ZJOI2008]杀蚂蚁 Big MoNI的更多相关文章
- bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster
http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...
- BZOJ1033:[ZJOI2008]杀蚂蚁antbuster(模拟)
Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右 下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的 ...
- [bzoj1033] [ZJOI2008]杀蚂蚁antbuster
Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...
- Luogu2586 [ZJOI2008]杀蚂蚁 ---- 模拟
Luogu2586 [ZJOI2008]杀蚂蚁 题意 还是一道大模拟 https://www.luogu.org/problemnew/show/P2586 大概就是炮塔大蚂蚁的故事 下载这个游戏ht ...
- [BZOJ 1033][ZJOI2008]杀蚂蚁antbuster
1033: [ZJOI2008]杀蚂蚁antbuster Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1200 Solved: 507[Submi ...
- [ZJOI2008]杀蚂蚁antbuster
[ZJOI2008]杀蚂蚁antbuster 题目 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试 ...
- P2586 [ZJOI2008]杀蚂蚁(模拟)
P2586 [ZJOI2008]杀蚂蚁 大模拟. 什么都不想补了. 看变量名感性理解吧 #include<iostream> #include<cstdio> #include ...
- BZOJ1033:[ZJOI2008]杀蚂蚁
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster
Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...
随机推荐
- EpiiServer 更快捷更方便的php+nginx环境定制化方案
EpiiServer是什么 更快捷更方便的php+nginx多应用部署环境. github仓库首页 https://github.com/epaii/epii-server gitee仓库 https ...
- hadoop生态搭建(3节点)-02.ssh配置
# ssh免密码登录 # ==================================================================node1# 一路狂按回车,最终生成(id ...
- Python系列5之模块
模块 1. 模块的分类 模块,又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体). (1)自定义模块 自己定义的一些可以独立完成某个功能的一段程序语句,可以是 ...
- 阿里云异常网络连接-可疑WebShell通信行为的分析解决办法
2018年10月27日接到新客户网站服务器被上传了webshell脚本木马后门问题的求助,对此我们sine安全公司针对此阿里云提示的安全问题进行了详细分析,ECS服务器被阿里云提示异常网络连接-可疑W ...
- HDU暑假多校第八场G-Card Game
一.题意 给出N个卡牌,卡牌的正反两面具有两个数字,取值范围为[1,2*n],给出若干个默认正面向上的卡牌,求最小反转多少张卡牌可以使得,每张卡牌朝上的面上都有一个不同的数字,同时满足最小反转次数的反 ...
- 20145202马超 实验二《Java面向对象程序设计》实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- OpenCV代码提取:flip函数的实现
OpenCV中实现图像翻转的函数flip,公式为: 目前fbc_cv库中也实现了flip函数,支持多通道,uchar和float两种数据类型,经测试,与OpenCV3.1结果完全一致. 实现代码fli ...
- .NET基础知识之七——索引器
索引器是什么?有什么作用?索引器允许类的实例以访问数组的形式来访问对象里面的属性.如我们经常可以看到类似于dr["name"]="test",或者 ...
- Question | 关于Android安全的一二事
本文来自网易云社区 "Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.ne ...
- ASP NET Core --- 资源塑形, HATEOAS, Media Type
参照 草根专栏- ASP.NET Core + Ng6 实战:https://v.qq.com/x/page/d07652pu1zi.html 一.Get返回资源塑形 1.添加集合塑形Enumerab ...