这个模拟就不用说了吧......

注意事项(救命的):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的更多相关文章

  1. bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster

    http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...

  2. BZOJ1033:[ZJOI2008]杀蚂蚁antbuster(模拟)

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右 下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的 ...

  3. [bzoj1033] [ZJOI2008]杀蚂蚁antbuster

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...

  4. Luogu2586 [ZJOI2008]杀蚂蚁 ---- 模拟

    Luogu2586 [ZJOI2008]杀蚂蚁 题意 还是一道大模拟 https://www.luogu.org/problemnew/show/P2586 大概就是炮塔大蚂蚁的故事 下载这个游戏ht ...

  5. [BZOJ 1033][ZJOI2008]杀蚂蚁antbuster

    1033: [ZJOI2008]杀蚂蚁antbuster Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1200  Solved: 507[Submi ...

  6. [ZJOI2008]杀蚂蚁antbuster

    [ZJOI2008]杀蚂蚁antbuster 题目 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试 ...

  7. P2586 [ZJOI2008]杀蚂蚁(模拟)

    P2586 [ZJOI2008]杀蚂蚁 大模拟. 什么都不想补了. 看变量名感性理解吧 #include<iostream> #include<cstdio> #include ...

  8. BZOJ1033:[ZJOI2008]杀蚂蚁

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  9. 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...

随机推荐

  1. php 操作RabbitMQ

    本文摘抄自:https://www.cnblogs.com/alin-qu/p/8312874.html php 操作RabbitMQ   基本流程图 如果exchange 没有绑定queue,则消息 ...

  2. 【7-10 PAT】树的遍历

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序列.第三 ...

  3. dns文件

    1.dns简介 dns为域名解析系统,当本地浏览器输入域名访问网站时,如果本地host中没有配置域名与IP的对应关系,那么域名信息将会被发送到dns服务器上,由dns服务器将域名解析为IP(过程较为复 ...

  4. n点游戏

    n点游戏 24点游戏是非常经典而简单的小游戏,从一堆扑克牌中抽取4张,向其中添加运算符号并使其运行结果恰等于24,这叫作24点游戏. 现在我们不再是组合24,而是组合出给定的数字n,但要求只可以利用任 ...

  5. 生産管理(PP)

    伝票系 製造指図 マスタ系 生産資源/治工具 作業区 能力 作業手順 作業バージョン 作業記録 需要予測プロファイル 計画手配 MRP レシピ その他 カスタマイズ系 BOM関連 製造指図確認 伝票系 ...

  6. linux io 学习笔记(02)---条件变量,管道,信号

    条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t  定 ...

  7. js获取浏览器内容宽高(小计)

    <SCRIPT LANGUAGE="JavaScript">var  s = "";s += "\r\n网页可见区域宽:"+ d ...

  8. python中的os,shutil模块的定义以及用法

    # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Uni ...

  9. NetBeans集成SVN代码管理实例

    最近给银行做一个小工具,要求用Java做一个C端带界面的小工具,想来想去用NetBeans最合适,因为Eclipse,MyEclipse,IDEA这些做界面得要额外的UI插件,比较麻烦. 我跟同事两个 ...

  10. [译]如何比较同一分支上的不同commit的代码区别?

    原文来源:https://stackoverflow.com/questions/3338126/how-do-i-diff-the-same-file-between-two-different-c ...