二模 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;
}

(简直短到奇葩)

时间: 2024-10-05 04:46:05

二模 06day2的相关文章

二模 (8) day2

第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得到相应得分.现在要你引爆 k 个炸弹,使得得分最大. 解题过程: 1.一开始想到算出每个入度为0的点打掉之后的得分,然后做个堆,从大到小打,但是路径会有重叠的情况,也就是说打掉一条路径后可能会导致另外一条路径的权值发生变化.. 2.然后听到YYL大神一直在说2次BFS,就想到可以倒着来做..从出度为

PMP备考资料 | 2019/2020年PMP全真模拟题 、一模、二模、三模试题 | PMP章节练习题 | 附带详细答案解析 --- 项目整合管理 等(PMBOK&#174;第六版)

PMP备考资料 | 2019/2020年PMP全真模拟题 .一模.二模.三模试题 | PMP章节练习题 | 附带详细答案解析 --- 项目整合管理 等(PMBOK®第六版),获取:http://t.cn/A6POWgMw 原文地址:https://www.cnblogs.com/chunlynn/p/12252179.html

二模 (9) day2

第一题: 题目大意:求满足条件P的N位二进制数的个数.P:该二进制数有至少3个0或者3个1挨在一起.. N<=20000 解题过程: 1.一开始直接写了个dfs把表打了出来,不过没发现什么规律,然后就尝试着反过来想,先求出不满足条件P的个数,然后总个数减一下.然后就把2^N-ans输了出来,结果发现是个斐波那契数列.(打表大法好啊) 2.如果直接写高精度是要超时并且爆空间的..所以要用滚动数组并且万进制优化(实际上我用了16位数字压成一个long long),貌似20000的数据万进制还是太慢.

二模01day1解题报告

T1.音量调节(changingsounds) 有n个物品的背包(有点不一样,每个物品必须取),给出初始价值,物品价值可正可负(就是两种选择嘛),求可能的最大价值,不可能(<0或>maxsound)输出-1. 很简单的,f[i][j]表示的是到第i首歌时音量为j是否可能. f[i][j]=f[i-1][j-c[i]]||f[i-1][j+c[i]]  (j-c[i]>=0,j+c[i]<=maxsound) 不贴代码啦. T2.旅行(journey) 有n*m的矩阵由’.’和’X’

二模 (3) day1

第一题: 题目描述: 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.给定 A,B 和 n 的值,要求计算 f(n)的值.(1≤ A, B ≤1000, 1 ≤n≤100,000,000). 解题过程: 1.方法一:矩阵乘法. 2.方法二:hash.如果 Ak,Ak+1  确定了,那么Ak+2 就确定了,而Ak,Ak+1 的值都是小于7的,所以做个二维hash,记录Ak,Ak+1  第一次出现的位置,就可

二模 (12) day1

第一题: 题目大意: 求由N个1,M个0组成的排列的个数,要求在排列的任意一个前缀中,1的个数不少于0的个数.N,M<=5000. 解题过程: 1.看到N,M的范围就明确肯定不会是dp,因为起码要用二维表示状态,就算转移是O(1),也要5000*5000的时间,况且还要高精度,绝对超时. 2.于是想到可以根据Catalan数的推导方法来推出公式. ps:Catalan数的推导方法和一些应用可以参考我之前的博文中的问题二http://www.cnblogs.com/vb4896/p/3874622

二模 (6) day2

第一题: 题目大意:50*50的格子里玩贪吃蛇.给出N步扭头的操作,判断贪吃蛇会在第几步挂掉.(蛇初始向东) 解题过程: 1.一开始的方法是:为了加快速度,只保存头和尾的坐标,然后保存尾巴的方向,每次move先头运动,然后尾巴按照之前的方向运动直到需要改变方向(继续按之前的方向运动将撞到墙壁或者走到一个map[x][y]==0的地方)..事实证明这样是错误的.有可能尾巴继续走会到一个map[x][y]==0的地方,但是还不需要改变方向.. 运气不错,竟然还拿到了60分. 2.AC算法:保存所有点

二模 (2) day2

第一题: 题目描述: 在一个长方形框子里,最多有 N(0≤N≤6)个相异的点.在其中任何-个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴.那么应该按照怎样的顺序在这 N 个点上放置油滴,才能使放置完毕后所有油滴占据的总面积最大呢?(不同的油滴不会相互融合)注:圆的面积公式 V=pi*r*r,其中 r 为圆的半径 解题过程: 1.考虑到最多只有6个点,那么直接dfs实现枚举即可. 2.注意题目要求的是剩余面积...还有如果

二模 (7) day1

第一题: 题目大意: 给出数轴上N棵树的坐标和高度,如果两棵树之间的距离小于其中一颗树的高度,那么就有树会被挡住.因此要把一些树砍矮一点.求砍树的总高度最小值. N<=100000; 解题过程: 1.水题,直接按坐标升序排个序,然后看某棵树左右的树会不会被挡住,砍掉相应的高度即可.. 特殊考虑最左边的树和最右边的树. 初始得分100. 第二题: 求从给定的n个数中取一些数(必须取),使得他们的乘积 mod p = c 的方案数.n≤32,p≤10^9,c≤10^9,a[i]<p,p 是质数 解