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]杀蚂蚁(模拟)的更多相关文章

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

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

  2. P2586 [ZJOI2008]杀蚂蚁

    传送门 快乐模拟,修身养性 代码长度其实还好,主要是细节多 只要知道一些计算几何基础知识即可快乐模拟,按着题目要求一步步实现就行啦 注意仔细读题,蚂蚁每 $5$ 秒乱走一次的时候是只要能走就走了,不一 ...

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

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

  4. [ZJOI2008]杀蚂蚁antbuster

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

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

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

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

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

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

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

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

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

  9. BZOJ1033:[ZJOI2008]杀蚂蚁

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

随机推荐

  1. JavaScript正则表达式(四)

    正则表达式方法 一.test方法 用于测试字符串参数中是否存在匹配正则表达式模式的字符串 如果存在就返回true,否则返回false 实例: 1.使用test方法不设置g标志时  2.使用test方法 ...

  2. sql server 修改表字段

    1.添加表说明 EXECUTE sp_addextendedproperty N'MS_Description','表说明',N'user',N'dbo',N'table',N'表名',NULL,NU ...

  3. 牛飞盘队Cow Frisbee Team

    老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的N头奶牛中选出一支队伍. 每只奶牛的能力为整数,第i头奶牛的能力为R i .飞盘队的队员数量不能少于 .大于N. 一支队伍的总能力就是所有队员能力 ...

  4. Activiti组任务(十)

    1 Candidate-users 候选人 1.1需求 在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修 ...

  5. CodeForces 1197D Yet Another Subarray Problem

    Time limit 2000 ms Memory limit 262144 kB Source Educational Codeforces Round 69 (Rated for Div. 2) ...

  6. 【CF1256F】Equalizing Two Strings(逆序对)

    题意:给定两个长度均为n且由小写字母组成的字符串,可以进行若干次操作,每次从两个串中分别选一个长度相等的子串进行翻转,问是否存在能使两串相等的一系列操作方案 n<=2e5 思路:首先如果每种字母 ...

  7. 【PowerOJ1742&网络流24题】试题库问题(最大流)

    题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...

  8. DC.p4: programming the forwarding plane of a data-center switch

    Name of article:Dc. p4: Programming the forwarding plane of a data-center switch Origin of the artic ...

  9. Web 与 Node 基础

    浏览器端发送请求(browser) 浏览器或者模拟发送 http 请求端 服务端处理请求(web) 服务器(使用 node ) 2.1. 使用 Forever 管理程序 2.2. 可以使用 PM2 代 ...

  10. progress组件(进度条)

    progress组件:进度条 progress组件的属性: percent:类型:number 设置百分比 (0~100) show-info:类型:布尔 在进度条右侧显示百分比 border-rad ...