二模 06day2

很长时间没更新有意义的题目了呢,这是一套题撒,于是乎我便开心的边刷题边发题解了撒.

第一题: interval

比较好玩的一题撒, 分分钟过了, 就是模拟贪吃蛇但是没有食物(嗯,只要你判断冲突).

整个数组拿来移当然是不行的撒, 只要在末尾移去一个方格再向头部正对出放一个方格就行了撒.

编程复杂度挺低的, 可以直接修改一下做贪吃蛇游戏的后台.

(最坑的地方就是坐标系.无图无**)

其实也不算很坑啦.

#include <cstdio>
#include <cstring>
struct point{
	int x,y;
};
point gpos(char ch,point c){
	switch(ch){
		case 'E':
			++c.x;
			break;
		case 'W':
			--c.x;
			break;
		case 'S':
			--c.y;
			break;
		case 'N':
			++c.y;
			break;
	}
	return c;
}
struct queue{
	point q[2000],t;
	bool map[100][100];
	int s,e,i;
	int move(char c){
		map[q[s].x][q[s].y]=false;
		++s;
		t=gpos(c,q[e-1]);
		if(t.x>50||t.x<0) return 1;
		if(t.y>50||t.y<0) return 1;
		if(map[t.x][t.y]) return 2;
		map[t.x][t.y]=true;
		q[e]=t;
		++e;
		return 0;
	}
	void reset(){
		memset(map,0,sizeof map);
		memset(q,0,sizeof q);
		s=e=0;
		for(i=11;i<=30;++i){
			q[e].y=25;
			q[e].x=i;
			map[i][25]=true;
			++e;
		}
	}
} q;
int i,j,n;
char c,str[1000];
bool f;
int main(){
	freopen("interval.in","r",stdin);
	freopen("interval.out","w",stdout);
	while(scanf("%d\n",&n),n){
		q.reset();
		f=false;
		scanf("%s",str);
		for(i=0;i<n;++i){
			c=str[i];
			j=q.move(c);
			if(j){
				if(j==1){
					printf("The worm ran off the board on move %d.\n", i+1);
				}else{
					printf("The worm ran into itself on move %d.\n", i+1);
				}
				f=true;
				break;
			}
		}
		if(!f) printf("The worm successfully made all %d moves.\n", n);
	}
	return 0;
}

第二题 直角三角形

平面上给定 n 个两两不同的整数点,统计以给定的点为顶点,其直角边平行于坐标轴的直角三角形的个数.

嗯横纵轴离散化.(嗯hash似乎比较好,统计x,y的实在不想写啊摔)

为什么离散化呢因为数据范围不小.

30%的数据满足 n≤100;
50%的数据满足 n≤1000;
100%的数据满足 0<n≤100,000,所有坐标不超过 32 位整数范围。

就是这样辣.

#include <cstdio>
struct node{
	int d,n;
	long long s;
} p[200000];
int he[2][103979],pl,temp,temp2;
inline int find(int h,bool n){
	temp=h;
	temp2=h=h%103979;
	h=he[n][h];
	while(h && p[h].d!=temp) h=p[h].n;
	if(h) return h;
	++pl;
	p[pl].n=he[n][temp2];
	p[pl].d=temp;
	p[pl].s=0;
	he[n][temp2]=pl;
	return pl;
}
long long sum;
int i,n,a,b;
int xs[200000],ys[200000];
int main(int argc, char const *argv[]){
	freopen("right.in","r",stdin);
	freopen("right.out","w",stdout);
	scanf("%d",&n);
	for(i=0;i<n;++i){
		scanf("%d %d",&a,&b);
		xs[i]=a;
		ys[i]=b;
		a=find(a,0),b=find(b,1);
		++p[a].s,++p[b].s;
	}
	for(i=0;i<n;++i){
		a=find(xs[i],0),b=find(ys[i],1);
		sum+=(p[a].s-1)*(p[b].s-1);
	}
	printf("%lld\n", sum);
	return 0;
}

(简直短到奇葩)

 

posted @ 2014-09-27 21:09  zball  阅读(145)  评论(0编辑  收藏  举报