2016年天梯赛初赛重现

L1-1 到底有多2

这道题是一道简单模拟题,注意点在于可以叠加,也就是负数和偶数是两种情况。

#include 
using namespace std;
char q[51];
double shu=0;
int main()
{
	scanf("%s",q);
	for(long long i=strlen(q)-1;i>=0;i--)
		if(q[i]=='2') shu++;
	if(q[0]=='-') shu=shu/(strlen(q)-1);
	else shu/=strlen(q);
	if(q[0]=='-') shu*=1.5;
	if(!((q[strlen(q)-1]-'0')%2)) shu*=2;
	printf("%.2lf%%\n",shu*100);
	return 0;
}

L1-2 大笨钟

这道题也是一道简单模拟题,注意点有三个,一个是0点到12点的端点时间不报时,第二个是Dang的数量按12小时算,第三个是整点情况,不能直接将小时加一。

#include 
using namespace std;
long long a,b;
int main()
{
	scanf("%lld:%lld",&a,&b);
	if((a>=0&&a<=11)||(a==12&&!b)) printf("Only %02lld:%02lld.  Too early to Dang.\n",a,b);
	else
	{
		if(b) a++;
		for(long long i=1;i<=a-12;i++) printf("Dang");
		printf("\n");
	}
	return 0;
}

L1-3 谁先倒

这个题不难,但是玩儿文字游戏,倒下的条件是超过酒量,也就是说酒量是1杯,他喝1杯不会倒,2杯才倒。

#include 
using namespace std;
long long al,bl,k,ah,bh;
long long a,b,c,d;
bool dao=0;
int main()
{
	scanf("%lld %lld %lld",&al,&bl,&k);
	while(k--)
	{
		scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
		if(dao) continue;
		if(((b==(a+c))&&(d==(a+c)))||((b!=(a+c))&&(d!=(a+c)))) continue;
		if(b==(a+c))
		{
			al--;
			ah++;
			if(al<0)
			{
				printf("A\n%lld\n",bh);
				dao=1;
			}
		}
		else
		{
			bl--;
			bh++;
			if(bl<0)
			{
				printf("B\n%lld\n",ah);
				dao=1;
			}
		}
	}
	return 0;
}

L1-4 帅到没朋友

这道题更偏向于数组模拟题,只要把朋友圈大于等于2的圈子里的所有人打上标记,代表不符合条件的人,然后在输出时,由于一个人只能输出一次,所以在输出一次后,也把他打上标记,最后还要判断一下是否有输出,没有输出过要输出一行No one is handsome

#include 
using namespace std;
long long n,k;
bool v[100001],wu=1;
int main()
{
	scanf("%lld",&k);
	while(k--)
	{
		scanf("%lld",&n);
		for(long long i=1;i<=n;i++)
		{
			long long a;
			scanf("%lld",&a);
			if(n-1) v[a]=1;
		}
	}
	scanf("%lld",&k);
	while(k--)
	{
		long long a;
		scanf("%lld",&a);
		if(!v[a])
		{
			if(!wu) printf(" ");
			printf("%05lld",a);
			v[a]=1;
			wu=0;
		}
	}
	if(wu) printf("No one is handsome\n");
	else printf("\n");
	return 0;
}

L1-5 重要的话说三遍

直接输出

#include 
using namespace std;
int main()
{
	printf("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!\n");
	return 0;
}

L1-6 奇偶分家

简单模拟,判断奇数偶数。

#include 
using namespace std;
long long n,a,b;
int main()
{
	scanf("%lld",&n);
	while(n--)
	{
		long long k;
		scanf("%lld",&k);
		if(k%2) a++;
		else b++;
	}
	printf("%lld %lld\n",a,b);
	return 0;
}

L1-7 输出GPLT

简单字符串,审题认真一点就行,一个点是忽略其他字符,第二个点是按顺序输出。


```cpp
#include 
using namespace std;
long long ji[4];
char q[10001];
int main()
{
	scanf("%s",q);
	for(long long i=0;i

L1-8 后天

一道很简单的数学题,不用数学方法手动模拟也可以。

#include 
using namespace std;
long long n;
int main()
{
	scanf("%lld",&n);
	printf("%lld\n",(n+1)%7+1);
	return 0;
}

L2-1 抢红包

一道稍微有点儿复杂的sort排序题,把排序关系想清楚即可,记得自己发红包是要掏钱的,所以记得发红包的时候对应减去自己掏的钱,才是自己实际得到的钱。

#include 
using namespace std;
long long n;
struct point
{
	double shu;
	long long id,ge;
}qian[10001];
bool operator<(const point a,const point b)
{
	if(a.shu==b.shu)
	{
		if(a.ge==b.ge) return a.idb.ge;
	}
	return a.shu>b.shu;
}
int main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)
	{
		long long k;
		scanf("%lld",&k);
		while(k--)
		{
			long long a,b;
			scanf("%lld %lld",&a,&b);
			qian[a].shu+=b;
			qian[a].ge++;
			qian[i].shu-=b;
		}
		qian[i].id=i;
	}
	sort(qian+1,qian+1+n);
	for(long long i=1;i<=n;i++) printf("%lld %.2lf\n",qian[i].id,qian[i].shu/100);
	return 0;
}

L2-2 排座位

这道题我最开始想用二维数组直接做,但实际由于里面关系过于复杂,二维数组很不好模拟出之间的关系,有一个点过不去,而这道题是一道很明显的并查集类题目,所以可以用并查集的方式将朋友放在一起,利用二维数组对仇人打标记,然后根据要求一句一句翻译成代码就好。

#include 
using namespace std;
long long n,k,m,guan[101][101],par[101];
long long find(long long x)
{
	return x==par[x]?x:par[x]=find(par[x]);
}
int main()
{
	scanf("%lld %lld %lld",&n,&m,&k);
	for(long long i=1;i<=n;i++) par[i]=i;
	for(long long i=1;i<=m;i++)
	{
		long long a,b,c;
		scanf("%lld %lld %lld",&a,&b,&c);
		guan[a][b]=c;
		guan[b][a]=c;
		if(c!=-1&&find(a)!=find(b)) par[find(a)]=find(b);
	}
	while(k--)
	{
		long long a,b;
		scanf("%lld %lld",&a,&b);
		if(guan[a][b]!=-1&&find(a)!=find(b)) printf("OK\n");
		else if(guan[a][b]!=-1&&find(a)==find(b)) printf("No problem\n");
		else if(guan[a][b]==-1&&find(a)==find(b)) printf("OK but...\n");
		else if(guan[a][b]==-1&&find(a)!=find(b)) printf("No way\n");
	}
	return 0;
}

L2-3 玩转二叉树

这个题看起来很复杂,但实际上就是一道基础的二叉树的题,说是二叉树翻转,再层序遍历,但本质上就是每层从右往左依次输出,没什么特别难的,有一个坑,就是键值,是可以大于n的,经过实测,定为100是没有问题的。

#include 
using namespace std;
long long n;
long long qian[100],zhong[100],ceng[100];
struct point
{
	long long r,l;
}e[100];
void bian(long long qianr,long long qianl,long long zhongr,long long zhongl)
{
	if(qianr>qianl) return;
	e[qian[qianr]].r=0;
	e[qian[qianr]].l=0;
	long long wei;
	for(wei=zhongr;;wei++)
		if(zhong[wei]==qian[qianr]) break;
	if(wei!=zhongr)
	{
		bian(qianr+1,qianr+wei-zhongr,zhongr,wei-1);
		e[qian[qianr]].r=qian[qianr+1];
	}
	if(wei!=zhongl)
	{
		bian(qianr+wei-zhongr+1,qianl,wei+1,zhongl);
		e[qian[qianr]].l=qian[qianr+wei-zhongr+1];
	}
}
int main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++) scanf("%lld",&zhong[i]);
	for(long long i=1;i<=n;i++) scanf("%lld",&qian[i]);
	bian(1,n,1,n);
	long long head=0,tail=1;
	ceng[1]=qian[1];
	while(tail!=n)
	{
		head++;
		if(e[ceng[head]].l) ceng[++tail]=e[ceng[head]].l;
		if(e[ceng[head]].r) ceng[++tail]=e[ceng[head]].r;
	}
	for(long long i=1;i<=n;i++)
	{
		printf("%lld",ceng[i]);
		if(i!=n) printf(" ");
		else printf("\n");
	}
	return 0;
}

L2-4 关于堆的判断

这道题是一道简单建立小根堆问题,但有一个复杂字符串处理比较麻烦,不过,抓住规律就会简单一些,写之前缕清思路就好。

#include 
using namespace std;
long long n,m,shu[1001];
void pai(long long v)
{
	while(v>1)
	{
		if(shu[v]

L3-1 天梯地图

L3-2 喊山

L3-3 长城


这套题总的而言不难,以考察基础知识为主,只要熟练掌握了每个部分的基础知识并平时练习到位了,稳住心态做这套题应该不会出什么问题。

你可能感兴趣的:(学习笔记)