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

注意事项(救命的):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=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}return sum;
}
typedef long double LD;
LD Source_HP[250];
const LD eps=1e-12;
int Now_Rank=1,Rank_In;
int Information[25][25];
int pos[25][25];
int s,d,r;
int target;
struct Ant
{int S_HP,HP,x,y,old,id,X,Y;
}ant[10];
struct Tor
{int x,y;
}tor[25];
int t,T,n,m;
int ant_now;
int go1[4]={0,1,0,-1};
int go2[4]={1,0,-1,0};
inline void Read()
{n=read(),m=read(),s=read(),d=read(),r=read();for(int i=1;i<=s;i++)tor[i].x=read(),tor[i].y=read(),pos[tor[i].x][tor[i].y]=2;T=read();Source_HP[0]=4.0;for(int i=1;i<250;i++)Source_HP[i]=Source_HP[i-1]*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<6&&(pos[0][0]==0)){++ant_now;ant[ant_now].x=ant[ant_now].y=ant[ant_now].old=0;ant[ant_now].X=ant[ant_now].Y=-1;pos[0][0]=1;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==6)Rank_In=0,++Now_Rank;}for(int i=1;i<=ant_now;i++)Information[ant[i].x][ant[i].y]+=(i==target)?5:2;for(int i=1;i<=ant_now;i++){int to=-1,key=-1;if(ant[i].y!=m&&pos[ant[i].x+go1[0]][ant[i].y+go2[0]]==0&&Information[ant[i].x+go1[0]][ant[i].y+go2[0]]>key&&((ant[i].x+go1[0]==ant[i].X&&ant[i].y+go2[0]==ant[i].Y)==0))to=0,key=Information[ant[i].x+go1[0]][ant[i].y+go2[0]];if(ant[i].x!=n&&pos[ant[i].x+go1[1]][ant[i].y+go2[1]]==0&&Information[ant[i].x+go1[1]][ant[i].y+go2[1]]>key&&((ant[i].x+go1[1]==ant[i].X&&ant[i].y+go2[1]==ant[i].Y)==0))to=1,key=Information[ant[i].x+go1[1]][ant[i].y+go2[1]];if(ant[i].y!=0&&pos[ant[i].x+go1[2]][ant[i].y+go2[2]]==0&&Information[ant[i].x+go1[2]][ant[i].y+go2[2]]>key&&((ant[i].x+go1[2]==ant[i].X&&ant[i].y+go2[2]==ant[i].Y)==0))to=2,key=Information[ant[i].x+go1[2]][ant[i].y+go2[2]];if(ant[i].x!=0&&pos[ant[i].x+go1[3]][ant[i].y+go2[3]]==0&&Information[ant[i].x+go1[3]][ant[i].y+go2[3]]>key&&((ant[i].x+go1[3]==ant[i].X&&ant[i].y+go2[3]==ant[i].Y)==0))to=3,key=Information[ant[i].x+go1[3]][ant[i].y+go2[3]];if(to==-1){ant[i].X=ant[i].x;ant[i].Y=ant[i].y;if(target==0&&ant[i].x==n&&ant[i].y==m)target=i,ant[i].HP=(ant[i].HP+(ant[i].S_HP>>1))>=ant[i].S_HP?ant[i].S_HP:(ant[i].HP+(ant[i].S_HP>>1));continue;}if((ant[i].old+1)%5==0){to=(to==0)?3:(to-1);while(1)if(ant[i].x+go1[to]>=0&&ant[i].x+go1[to]<=n&&ant[i].y+go2[to]>=0&&ant[i].y+go2[to]<=m&&pos[ant[i].x+go1[to]][ant[i].y+go2[to]]==0&&(ant[i].x+go1[to]==ant[i].X&&ant[i].y+go2[to]==ant[i].Y)==0)break;elseto=(to==0)?3:(to-1);}ant[i].X=ant[i].x;ant[i].Y=ant[i].y;pos[ant[i].x+go1[to]][ant[i].y+go2[to]]=1;pos[ant[i].x][ant[i].y]=0;if(target==0&&ant[i].x+go1[to]==n&&ant[i].y+go2[to]==m)target=i,ant[i].HP=(ant[i].HP+(ant[i].S_HP>>1))>=ant[i].S_HP?ant[i].S_HP:(ant[i].HP+(ant[i].S_HP>>1));ant[i].x=ant[i].x+go1[to];ant[i].y=ant[i].y+go2[to];}if(target){for(int i=1;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!=0){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=1;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=1;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=1;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!=0){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=1;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=1;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=1;i<=s;i++){int dis=0x7fffffff;for(int j=1;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!=0){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=1;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=1;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=0;}}bool god=0;int temp=ant_now;ant_now=0;for(int i=1;i<=temp;i++)if(ant[i].HP<0){ if(i==target) target=0; pos[ant[i].x][ant[i].y]=0;}else{if(i==target){if(ant[i].x==0&&ant[i].y==0) god=1;target=ant_now+1;}ant[++ant_now]=ant[i];}for(int i=0;i<=n;i++)for(int j=0;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=1;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 0;}for(int i=1;i<=ant_now;i++)++ant[i].old;}printf("The game is going on\n");printf("%d\n",ant_now);for(int i=1;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 0;
}

转载于:https://www.cnblogs.com/TSHugh/p/7237450.html

[bzoj1033] [ZJOI2008]杀蚂蚁 Big MoNI相关推荐

  1. [BZOJ1033][ZJOI2008]杀蚂蚁antbuster(大模拟)

    题目描述 传送门 题解 bz的题面真心不爽,建议去codevs 比较良心的一道大模拟,题面写的比较清楚,也没有什么坑 几个需要注意的地方 1.对于每一只蚂蚁来说,年龄=秒数-1 2.选择方向的过程是: ...

  2. 【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster【模拟】

    (´:ω:`) 有以下几点要注意: 1,蚂蚁不是质点. 2,蚂蚁的直径是1,不是半径是1. 3,给蚂蚁按age排序的时候,不要忘了target也得跟着变. 4,过早优化就是死,直接维护信息素的值就好了 ...

  3. zjoi 2008 杀蚂蚁

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

  4. luogu P2198 杀蚂蚁

    题目描述 经过小FF的研究,他发现蚂蚁们每次都走同一条长度为n个单位的路线进攻, 且蚂蚁们的经过一个单位长度所需的时间为T秒.也就是说,只要小FF在条路线上布防且给蚂蚁造成沉痛伤害就能阻止蚂蚁的进军. ...

  5. 洛谷-P2198 杀蚂蚁

    Solution 大致感受一下,我们就可以发现似乎激光塔一定要放在最末尾才能最大化一个激光塔给蚂蚁的伤害,所以所有的激光塔我们强制全部放在最末尾.然后呢,我们需要把前面的多余空位合理安排给放射塔和激光 ...

  6. 2019.3.summary

    emmmm,把以前写的2b总结丢上来吧,不过应该也不会有人看QAQ (注:因为用txt写的,有一些公式打的很随意,放到markdown上公式自动排版,有可能会显示出错误!可在下方留言) 2019.2. ...

  7. BZOJ2548:[CTSC2002]灭鼠行动

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

  8. BZOJ1972:[SDOI2010]猪国杀

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

  9. [SDOI2010] 猪国杀

    NOIp前最后皮一下,祝自己RP++. 从昨天晚上开始写,一直写到现在才A...... 在LXD大佬的帮助下,终于A掉了...... 还发现有两道大模拟,一个是琪露诺的冰雪小屋,一个是杀蚂蚁,有兴趣的 ...

  10. 2019暑假绍兴第一中学游记

    Day 0 12:40到了衢州二中,老叶讲了点东西就上路(去绍兴)了. 路上坐大巴坐了四个小时,看$abc__________$写了下他博客的$Argon$主题,然后做了会儿作业. 到了绍兴第一中学旁 ...

最新文章

  1. Leetcode 120. 三角形最小路径和 解题思路及C++实现
  2. 编码utf-8的不可映射字符_MySQL 请不要使用“utf8”
  3. C4.5最新版本Release8与MDL的关系的详细解读
  4. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形
  5. makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解
  6. 软考高项(信息系统项目管理师)计算题公式汇总
  7. 浅谈 光学字符识别(OCR识别)技术的前世今生...
  8. 常用工作方法总结(7S、SWOT分析、PDCA循环、SMART原则、6W2H、时间管理、WBS等)
  9. 根据旋转矩阵计算角度差
  10. 当小米MIX 2遇到iPhone X 你会怎么选?
  11. leaflet图标样式
  12. 优秀不够,你是否无可替代
  13. 如何将mp4视频制作成gif表情包
  14. RH850 F1L text段代码与S19文件解析
  15. 2020年中国热成像品牌崛起,高德红外跃居全球第二
  16. charles的简介、安装、破解及使用教程
  17. Android Bitmap 像素格式与字节数组
  18. 智能终端:开辟移动增值业务的新天地
  19. windoews连接linux终端,Linux Samba 与 Windoews 共享文件
  20. /*已知一个排好序的数组,按数组原排序方式插入一个数据*/

热门文章

  1. Illustrator 教程,如何在 Illustrator 中重新塑造文本?
  2. 在 Mac 上的 Keynote 讲演中如何更改共享演示文稿的设置?
  3. CAD迷你看图 for Mac
  4. 如何设置Mac允许远程电脑SSH登录?
  5. 10x程序员是如何思考的?
  6. Android应用分析进阶教程之一- 初识JEBAPI
  7. Metasploit物联网安全渗透测试增加对硬件的支持
  8. 【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore
  9. 怎样与用户有效地沟通以获取用户的真实需求?
  10. 【python】编程语言入门经典100例--11