2017.9.23 C组比赛总结

今天又回到了C组,感觉爽歪歪~分数终于是个三位数了,yes!

第一题,赛车。水!只用一个贪心就可以AC了。
first,以速度为关键字小到大qsort一下。。。
scond,枚举每一个赛车,看看它可以去哪一个车道(取它开得最慢的那一个)。
then,输出答案。
finely,AC

第二题,数列。一眼望去,就是一道小学奥数题。
个位的1:N div 10+如果n mod 10 >0就是1,否则是0
十位的1:N div 10010+min(N%100,19)-9
百位的1:N div 1000
100+min(N%1000,199)-99
……
以此类推,我们可以得到一条公式(自己推)。

第三题,炸僵尸。宽搜。

PS:这些僵尸怎么那么眼熟?那个炸弹是小星星从椰子加农炮那里偷的吧!
言归正传。
我们先预处理一下,开四个数组:
left[i][j]:表示第i行第j列的点左边(包括它自己)的僵尸数量。
right[i][j]:表示第i行第j列的点右边(包括它自己)的僵尸数量。
up[i][j]:表示第i行第j列的点上面(包括它自己)的僵尸数量。
down[i][j]:表示第i行第j列的点下面(包括它自己)的僵尸数量。
注意墙!
然后对于一个没有僵尸的点,设它的坐标为(i,j),那么在它那里引爆就可以炸死left[i][j]+right[i][j]+up[i][j]+down[i][j]只僵尸。
然而比赛时80分,后来改到90分,最后的数据:
我输出26,正确答案24!
改了很久也没有对。
看标程时,发现标程的date数组(存走到过的点),只开到了10^5那么大,开小了!还没有走到可以炸26只僵尸的那个点就崩了(为什么不会运行时错误?!)。
于是告诉了老师这个问题,改了一下数据就AC了。
下面附上标程。

第四题,梦里的难题,很坑。
小星星真是的,胆子小还去看这种电影!
比赛时由于看了一下B组的题,还想了很久,时间不够用,就弃疗了。
只用把这串数字分成尽量多的几组,每一组都包含1~K的所有数,最后输出分的组数+1就可以了。

总结:不要浪费时间,下次继续努力!

第三题标程:

#include<cstdio>
using namespace std;
struct coordinate
{
	int x,y;
}date[4000100];
char map[2010][2010];
int left[2010][2010],right[2010][2010],up[2010][2010],down[2010][2010];
bool b[2010][2010];
const int dx[4]={1,0,-1,0},
          dy[4]={0,1,0,-1};
int main()
{
	freopen("boom.in","r",stdin);
	freopen("boom.out","w",stdout);
	int n,m,tx,ty,i,j,head=0,tail=1,xx,yy,ans=0,k;
	scanf("%d %d %d %d\n",&n,&m,&tx,&ty);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			scanf("%c",&map[i][j]);
			if(map[i][j]=='#') left[i][j]=up[i][j]=0;
			else
			{
				left[i][j]=left[i][j-1];
				up[i][j]=up[i-1][j];
				if(map[i][j]=='G')
				{
					left[i][j]++;
					up[i][j]++;
				}
			}
		}
		scanf("\n");
	}
	for(i=n;i>0;i--)
	{
		for(j=m;j>0;j--)
		{
			if(map[i][j]=='#') right[i][j]=down[i][j]=0;
			else
			{
				right[i][j]=right[i][j+1];
				down[i][j]=down[i+1][j];
				if(map[i][j]=='G')
				{
					right[i][j]++;
					down[i][j]++;
				}
			}
		}
	}
	date[1].x=tx,date[1].y=ty;
	b[tx][ty]=true;
	while(head<tail)
	{
		head++;
		xx=date[head].x,yy=date[head].y;
		k=left[xx][yy]+right[xx][yy]+up[xx][yy]+down[xx][yy];
		if(k>ans) ans=k;
		for(i=0;i<4;i++)
		{
			xx=date[head].x+dx[i];
			yy=date[head].y+dy[i];
			if(map[xx][yy]=='.')
			{
				if(!b[xx][yy])
				{
					b[xx][yy]=true;
					tail++;
					date[tail].x=xx;
					date[tail].y=yy;
				}
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2019-07-08 21:52  Alexander_菜鸡  阅读(84)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end