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 ...
随机推荐
- JavaScript正则表达式(四)
正则表达式方法 一.test方法 用于测试字符串参数中是否存在匹配正则表达式模式的字符串 如果存在就返回true,否则返回false 实例: 1.使用test方法不设置g标志时 2.使用test方法 ...
- sql server 修改表字段
1.添加表说明 EXECUTE sp_addextendedproperty N'MS_Description','表说明',N'user',N'dbo',N'table',N'表名',NULL,NU ...
- 牛飞盘队Cow Frisbee Team
老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的N头奶牛中选出一支队伍. 每只奶牛的能力为整数,第i头奶牛的能力为R i .飞盘队的队员数量不能少于 .大于N. 一支队伍的总能力就是所有队员能力 ...
- Activiti组任务(十)
1 Candidate-users 候选人 1.1需求 在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修 ...
- CodeForces 1197D Yet Another Subarray Problem
Time limit 2000 ms Memory limit 262144 kB Source Educational Codeforces Round 69 (Rated for Div. 2) ...
- 【CF1256F】Equalizing Two Strings(逆序对)
题意:给定两个长度均为n且由小写字母组成的字符串,可以进行若干次操作,每次从两个串中分别选一个长度相等的子串进行翻转,问是否存在能使两串相等的一系列操作方案 n<=2e5 思路:首先如果每种字母 ...
- 【PowerOJ1742&网络流24题】试题库问题(最大流)
题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...
- 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 ...
- Web 与 Node 基础
浏览器端发送请求(browser) 浏览器或者模拟发送 http 请求端 服务端处理请求(web) 服务器(使用 node ) 2.1. 使用 Forever 管理程序 2.2. 可以使用 PM2 代 ...
- progress组件(进度条)
progress组件:进度条 progress组件的属性: percent:类型:number 设置百分比 (0~100) show-info:类型:布尔 在进度条右侧显示百分比 border-rad ...