题目描述
题解
bz的题面真心不爽,建议去codevs
比较良心的一道大模拟,题面写的比较清楚,也没有什么坑
几个需要注意的地方
1、对于每一只蚂蚁来说,年龄=秒数-1
2、选择方向的过程是:首先根据规则1-3选出一个方向,这个时候判断如果秒数不是5的倍数的话就直接走过去;如果是5的倍数就按照下一个规则继续选一个方向然后走过去。注意可达点的定义以及各种前提(先可达、再信息素最大)
3、杀死一只蚂蚁之后,需要更新:地图,当前蚂蚁数量,蛋糕
4、炮攻击的时候用计算几何的方法算点线距
剩下的严格根据题目描述和顺序就行了
具体看代码
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 200005
double eps=1e-9;
int dcmp(double x)
{
if (x<=eps&&x>=-eps) return 0;
return (x>0)?1:-1;
}
struct Vector
{
double x,y;
Vector(double X=0,double Y=0)
{
x=X,y=Y;
}
};
typedef Vector Point;
Vector operator + (Vector a,Vector b) {
return Vector(a.x+b.x,a.y+b.y);}
Vector operator - (Vector a,Vector b) {
return Vector(a.x-b.x,a.y-b.y);}
bool operator == (Vector a,Vector b) {
return a.x==b.x&&a.y==b.y;}
double Dot(Vector a,Vector b)
{
return a.x*b.x+a.y*b.y;
}
double Cross(Vector a,Vector b)
{
return a.x*b.y-a.y*b.x;
}
double Len(Vector a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
double DisTS(Point P,Point A,Point B)
{
if (A==B) return Len(P-A);
Vector v=B-A,w=P-A,u=P-B;
if (dcmp(Dot(v,w))<0) return Len(w);
else if (dcmp(Dot(v,u))>0) return Len(u);
else return fabs(Cross(v,w)/Len(v));
}
//n,m是地图范围,guncnt为炮的个数,d为每一次攻击的血量,r为攻击半径,t为模拟时间,T为当前时间
int n,m,guncnt,d,r,t,T;
//蚂蚁