• 二模 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){
    		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.
    ", i+1);
    				}else{
    					printf("The worm ran into itself on move %d.
    ", i+1);
    				}
    				f=true;
    				break;
    			}
    		}
    		if(!f) printf("The worm successfully made all %d moves.
    ", 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
    ", sum);
    	return 0;
    }
    

    (简直短到奇葩)

  • 相关阅读:
    Linux-命令-parted
    Linux-磁盘
    Linux-bash需要转意的字符
    Linux-命令-su-sudo-visudo
    Linux-命令-用户登录及日志查询
    Linux-练习-批量创建用户5密码长度
    250W电源带i7+GTX1080?
    ICMP type code 对应表(转)
    U盘FAT32转换NTFS格式
    Maxdos 9.3不能引导系统进入Maxdos
  • 原文地址:https://www.cnblogs.com/tmzbot/p/3997235.html
Copyright © 2020-2023  润新知