P2586 [ZJOI2008]杀蚂蚁(模拟)
大模拟。
什么都不想补了。
看变量名感性理解吧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef double db;
int n,m,t,s,d,gg,taken; db r;
int R,mes[][],vis[][],target;
db hp_up=; int lev_up,tt;
struct Poi{
int x,y;
Poi(int A=,int B=):x(A),y(B){}
Poi operator + (Poi &G){return Poi(x+G.x,y+G.y);}
Poi operator - (Poi &G){return Poi(x-G.x,y-G.y);}
bool operator != (Poi &G){return x!=G.x||y!=G.y;}
bool in(){return x>=&&x<=n&&y>=&&y<=m;}
void print(){printf("%d %d\n",x,y);}
}b[];
Poi di[]={Poi(,),Poi(,),Poi(,-),Poi(-,)};
struct ant{
int age,hp,lim,lev,cake; Poi id,ls;
void born(){hp=lim=*hp_up,lev=lev_up,age=,id=ls=Poi(,);cake=;}
void print(){printf("%d %d %d %d %d\n",age,lev,hp,id.x,id.y);}
}a[];
int dcmp(db x){return fabs(x)<1e-?:(x>?:-);}
db Dot(Poi A,Poi B){return A.x*B.x+A.y*B.y;}
db Cross(Poi A,Poi B){return A.x*B.y-A.y*B.x;}
db dis(Poi A){return sqrt(Dot(A,A));}
db dis2(Poi A,Poi B,Poi C){
Poi v1=A-B,v2=C-B,v3=A-C;
if(dcmp(Dot(v1,v2))<) return dis(v2);
if(dcmp(Dot(v2,v3))<) return dis(v3);
return fabs(Cross(v1,v3))/dis(v1);
}
void born(){if(tt%==) hp_up*=1.1,++lev_up; ++tt;a[++R].born();vis[][]=;}
void remain(int i){mes[a[i].id.x][a[i].id.y]+=a[i].cake?:;}
#define to (a[i].id+di[j])
void take(int i){
if(a[i].id.x==n&&a[i].id.y==m&&!taken)
taken=,a[i].hp=min(a[i].lim,a[i].hp+a[i].lim/),a[i].cake=;
}
void move(int i){
bool nx=,same=; int me[],mx=-,dir=;
for(int j=;j<;++j) if(to.in()&&!vis[to.x][to.y]&&to!=a[i].ls){
me[j]=mes[to.x][to.y];
if(me[j]>mx) mx=me[j],dir=j,same=;
else if(me[j]==mx) same=;
}
if(mx==-) {a[i].ls=a[i].id;take(i);return ;}
vis[a[i].id.x][a[i].id.y]=;
if(same){
for(int j=;j<;++j)
if(mx==me[j]&&to.in()&&!vis[to.x][to.y]&&to!=a[i].ls)
{dir=j; break;}
}
if(a[i].age%==){
for(int j=dir-;nx&&j>=;--j)
if(to.in()&&!vis[to.x][to.y]&&to!=a[i].ls)
nx=,dir=j;
for(int j=;nx&&j>=dir;--j)
if(to.in()&&!vis[to.x][to.y]&&to!=a[i].ls)
nx=,dir=j;
}
a[i].ls=a[i].id; a[i].id=a[i].id+di[dir];
vis[a[i].id.x][a[i].id.y]=; take(i);
}
void over(int i){
if(a[i].id.x==&&a[i].id.y==&&a[i].cake){gg=; return;}
}
void shoot(int i){
db len=dis(b[i]-a[target].id);
if(taken&&len<=r){
for(int j=;j<=R;++j)
if(j==target||dis2(b[i],a[target].id,a[j].id)<=0.5)
a[j].hp-=d;
}else{
db mn=r; int ad=-;
for(int j=R;j>=;--j){
len=dis(b[i]-a[j].id);
if(len<=mn) mn=len,ad=j;
}
if(ad>) a[ad].hp-=d;
}
}
void check(int i){
if(a[i].hp<){
if(a[i].cake) taken=;
vis[a[i].id.x][a[i].id.y]=;
for(int j=i;j<=R;++j) a[j]=a[j+];
--R;
}else ++a[i].age;
}
void disappear(){
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(mes[i][j]) --mes[i][j];
}
int main(){
scanf("%d%d%d%d%lf",&n,&m,&s,&d,&r);
for(int i=;i<=s;++i)
scanf("%d%d",&b[i].x,&b[i].y),vis[b[i].x][b[i].y]=;
scanf("%d",&t);
for(int i=,j;i<=t;++i){
if(!vis[][]&&R<) born();
for(j=;j<=R;++j) remain(j);
for(j=;j<=R;++j) move(j);
for(j=;j<=R;++j) if(a[j].cake) taken=,target=j;
for(j=;j<=s;++j) shoot(j);
for(j=R;j;--j) check(j);
for(j=;j<=R;++j) over(j);
if(gg){printf("Game over after %d seconds\n",i); break;}
disappear();
}
if(!gg) puts("The game is going on");
printf("%d\n",R);
for(int i=;i<=R;++i) a[i].age-=+gg,a[i].print();
return ;
}
P2586 [ZJOI2008]杀蚂蚁(模拟)的更多相关文章
- Luogu2586 [ZJOI2008]杀蚂蚁 ---- 模拟
Luogu2586 [ZJOI2008]杀蚂蚁 题意 还是一道大模拟 https://www.luogu.org/problemnew/show/P2586 大概就是炮塔大蚂蚁的故事 下载这个游戏ht ...
- P2586 [ZJOI2008]杀蚂蚁
传送门 快乐模拟,修身养性 代码长度其实还好,主要是细节多 只要知道一些计算几何基础知识即可快乐模拟,按着题目要求一步步实现就行啦 注意仔细读题,蚂蚁每 $5$ 秒乱走一次的时候是只要能走就走了,不一 ...
- [BZOJ 1033][ZJOI2008]杀蚂蚁antbuster
1033: [ZJOI2008]杀蚂蚁antbuster Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1200 Solved: 507[Submi ...
- [ZJOI2008]杀蚂蚁antbuster
[ZJOI2008]杀蚂蚁antbuster 题目 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试 ...
- BZOJ1033:[ZJOI2008]杀蚂蚁antbuster(模拟)
Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右 下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的 ...
- 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster
Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...
- bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster
http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...
- [bzoj1033] [ZJOI2008]杀蚂蚁antbuster
Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...
- BZOJ1033:[ZJOI2008]杀蚂蚁
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
随机推荐
- day02记
一.Tomcat搭建 1.service和controller分别搭建独立的Tomcat且port不一致 2.部署项目选择带有exploded的 3.运行时应先启动service再启动controll ...
- 七夕-心形表白-简单css代码
今天你要和谁过? 今天你要怎么过?? 今天去哪里吃??? 公司的三连问,对于一些单身狗有点招架不住啊. 在此送上一个薄礼,来安慰下受伤的心灵... 确定是安慰不是连环打击嘛..... 回答:确定! 来 ...
- 事物 @Transactional
转载:http://www.cnblogs.com/kristain/articles/2038397.html 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库 ...
- 【bzoj4136】[FJOI2015]带子串包含约束LCS问题
题目描述: 带有子串包含约束的最长公共子序列问题可以具体表述如下. 给定2个长度分别为n和m的序列X和Y,以及一个子串包含约束集S. S中共有k个字符串S={S1,S2,…,Sk},其中字符串Si的长 ...
- (3.2)狄泰软件学院C++课程学习剖析三
对课程前面40课的详细回顾分析(一) 0. int main() { // ① Array t(3,3); //普通模式 // ② Array *t=new Array(3,3); //指针方式 // ...
- 移动端与PHP服务端接口通信流程设计(基础版)
转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技 ...
- 使用自定义的tstring.h
UNICODE 控制函数是否用宽字符版本_UNICODE 控制字符串是否用宽字符集 _T("") 根据上述定义来解释字符集 // 在tchar.h中 // tstring.h ...
- codeforces 722F - Cyclic Cipher
题目链接:http://codeforces.com/problemset/problem/722/F ------------------------------------------------ ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_6_字符输出流写数据的其他方法
从1开始写写三个字符 最后多了个bcd 写入字符串 字符串的一部分