比赛 |
2008haoi模拟训练2 |
评测结果 |
AWWWWWWWWE |
题目名称 |
坦克游戏 |
最终得分 |
10 |
用户昵称 |
BYVoid |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2008-04-23 18:12:29 |
显示代码纯文本
#include <iostream>
#include <fstream>
#define MAXR 101
#define MAX 1001
using namespace std;
typedef struct
{
int x,y;
long v;
}point;
class heap
{
private:
point *hp;
public:
long size;
~heap()
{
free(hp);
}
heap()
{
size=0;
hp=(point *)malloc(sizeof(point)*MAX*MAX);
hp[0].v=0x7FFFFFF;
}
point del()
{
long i,child;
point rtnv=hp[1],mv=hp[size];
size--;
for (i=1;i*2<=size;i=child)
{
child=i*2;
if (child!=size)
if (hp[child+1].v>hp[child].v)
child++;
if (mv.v<hp[child].v)
hp[i]=hp[child];
else
break;
}
hp[i]=mv;
return rtnv;
}
void ins(point k)
{
long i;
size++;
for (i=size;hp[i/2].v<k.v;i/=2)
hp[i]=hp[i/2];
hp[i]=k;
}
};
ifstream fi("gametk.in");
ofstream fo("gametk.out");
long N,M,R,T,max_s=0;
point sq[MAX][MAX];
heap *H;
void init()
{
long i,j;
fi >> N >> M >> R >> T;
H=new heap();
for (i=1;i<=N;i++)
for (j=1;j<=M;j++)
{
fi >> sq[i+R][j+R].v;
sq[i+R][j+R].x=i+R;
sq[i+R][j+R].y=j+R;
if (i<=R && j<=R)
H->ins(sq[i+R][j+R]);
}
}
bool inr(point P,long x,long y)
{
return P.x>=x-R && P.x<=x+R && P.y>=y-R && P.y<=y+R;
}
void cs()
{
long i,j,k,t,S,cnt;
point g[MAXR];
for (i=1+R;i<=N;i++)
{
for (j=1+R;j<=M;j++)
{
t=T-(i+j-2-R-R);
cnt=0;
S=0;
for (k=1;k<=t;k++)
{
while ( !inr( (g[k]=H->del()),i,j ) && H->size>0);
S+=g[k].v;
cnt++;
if (g[k].v==0 || H->size==0)
break;
}
if (S>max_s)
max_s=S;
for (k=1;k<=cnt;k++)
H->ins(g[k]);
if (j<M)
for (k=i-R;k<=i+R;k++)
{
if (sq[k][j+R+1].v>0)
H->ins(sq[k][j+R+1]);
}
}
if (i<N)
for (k=1+R;k<=M;k++)
{
if (sq[i+R+1][k].v>0)
H->ins(sq[i+R+1][k]);
}
}
}
void print()
{
fo << max_s;
fi.close();
fo.close();
}
int main()
{
init();
cs();
print();
return 0;
}