GLPT团队程序设计天梯赛 模拟赛 2023 L1部分

目录

L1-1 嫑废话上代码 (5)

L1-2 九牛一毛 (5)

L1-3 小孩子才做选择,大人全都要 (10)

L1-4 拯救外星人 (10)

L1-5 试试手气 (15)

 L1-6 打PTA (15)

L1-7 机工士姆斯塔迪奥 (20) 

L1-8 随机输一次 (20)


L1-1 嫑废话上代码 (5)

Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。

输入格式:

本题没有输入。

输出格式:

在一行中输出 Talk is cheap. Show me the code.

输入样例:

输出样例:

Talk is cheap. Show me the code.

 个人题解:

#include<iostream>
using namespace std;
int main()
{
	cout<<"Talk is cheap. Show me the code.";
	return 0;
}

L1-2 九牛一毛 (5)

这是一道脑筋急转弯题:猪肉一斤 15 元,鸡肉一斤 20 元,那么一毛钱能买多少头牛?

答案是:9 —— 因为“九牛一毛”。

本题就请你按照这个逻辑,计算一下 N 块钱能买多少斤猪肉、多少斤鸡肉、多少头牛。

输入格式:

输入在一行中给出一个不超过 1000 的正整数 N,即以“元”为单位的货币量。

输出格式:

在一行中顺序输出 N 块钱能买多少斤猪肉、多少斤鸡肉、多少头牛。三个数字都只取整数部分,其间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

18

输出样例:

1 0 1620

个人题解 :

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	printf("%d %d %d",n/15,n/20,n*90);
	return 0;
}

L1-3 小孩子才做选择,大人全都要 (10)

阿汪面前有两只盲盒,每只盒子打开都有两种可能:或者装了 X 克狗粮,或者是一只容量为 Y 克的狗粮储蓄盒。如果是狗粮,阿汪可以快乐地吃掉;如果是空储蓄盒,那就倒霉了,阿汪必须想办法找到狗粮把这只储蓄盒装满,自己还吃不到。

正当阿汪发愁不知道该怎么选的时候,铲屎官大手一挥:“小孩子才做选择,大人全都要!”但全都要的结果,却不一定是赚了还是亏了……

我们假设聪明的阿汪总是能嗅出狗粮最多的盒子,并且绝不会选任何储蓄盒。而铲屎官没有这样的鼻子,他一定是全都要。铲屎官如果打开了有储蓄盒的盒子,就必须想办法把储蓄盒装满,他会优先用另一只盒子里的狗粮装(如果另外一只盒子里有狗粮),不够了还得自己去买新的狗粮,这样阿汪可就亏啦,什么都吃不到了。本题就请你判断阿汪到底是赚了还是亏了。

输入格式:

输入在一行中给出两个整数,绝对值都不超过 100,中间用一个空格分开,分别代表两只盒子里的东西。如果是正数就表示是狗粮的份量,如果是负数就表示绝对值是空盆的容量。两个数都肯定不是 0,因为保证没有空盒子。

输出格式:

第一行输出两个结果:如果让阿汪选能吃到的狗粮 A,和如果铲屎官全都要能吃到的狗粮 B。两个数字间用一个空格分开。如果铲屎官的决定让阿汪赚到了,就在第二行输出一个笑脸 ^_^,否则输出一个哭脸 T_T。但如果反正什么都吃不到(两个盒子里都没有狗粮),就输出一张躺平脸 -_-

输入样例 1:

12 18

输出样例 1:

18 30
^_^

输入样例 2:

12 -18

输出样例 2:

12 0
T_T

个人题解: 

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int g = max(n,m);
	int r = n+m;
	if(g<=0)
		g=0;
	if(r<=0)
		r=0;
	printf("%d %d\n",g,r);
	if(g==0&&r==0)
		printf("-_-");
	else if(g<r)
		printf("^_^");
	else 
		printf("T_T");
	return 0;
}

L1-4 拯救外星人 (10)

你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。

本题就请你写程序模仿外星人的行为。

输入格式:

输入在一行中给出两个正整数 A 和 B。

输出格式:

在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。

输入样例:

3 6

输出样例:

362880

 个人题解:

#include<iostream>
using namespace std;
int fact(int x)
{
	int fac=1;	
	for(int i=2;i<=x;i++)
		fac*=i;
	return fac;
}
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<fact(a+b);
	return 0;
}

L1-5 试试手气 (15)

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

输入格式:

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。

输出格式:

在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。

输入样例:

3 6 5 4 1 4
3

输出样例:

4 3 3 3 4 3

样例解释:

这 3 次摇出的结果依次为:

6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3

个人题解: 

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>a[6];
	int b[6],n;
	for(int i=0;i<6;i++)
		cin>>b[i];
	cin>>n;
	for(int i=0;i<6;i++)
	{
		for(int j=0;j<6;j++)
		{
			if(b[i]!=6-j)
				a[i].push_back(6-j);	
		}
	}
	for(int i=0;i<6;i++)
	{
		printf("%d",a[i][n-1]);
		if(i<5)
			printf(" ");
	}
	return 0;
}

 L1-6 打PTA (15)

传说这是集美大学的学生对话。本题要求你做一个简单的自动问答机,对任何一个问句,只要其中包含 PTA 就回答 Yes!,其他一概回答 No.

输入格式:

输入第一行给出一个整型范围内的正整数 N,随后 N 行,每行给出一个长度不超过 80 的字符串,为用户输入的句子,由英文字母、数字、空格和标点符号组成,以回车结束。

输出格式:

对每一行句子,如果其结尾字符为问号 ? 则判断此句中有无 PTA?如果有则在一行中输出 Yes!,否则输出 No.。如果不是问号结尾,则敷衍地回答 enen

输入样例:

5
Hello!
Do you still play WZRY?
Chi Ji?
you play PTA ah?
how about pta site?

输出样例:

enen
No.
No.
Yes!
No.

个人题解:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n;
	cin>>n;
	cin.get();
	while(n--)
	{
		string s;
		getline(cin,s);
		if(s[s.size()-1]!='?')
			cout<<"enen"<<endl;
		else
		{
			if(s.find("PTA")!=-1)
				cout<<"Yes!"<<endl;
			else
				cout<<"No."<<endl;
		}	
	}
	return 0;
}

L1-7 机工士姆斯塔迪奥 (20) 

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

5 5 3
0 2
0 4
1 3

输出样例:

12

个人题解: 

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int n,m,q;
	cin>>n>>m>>q;
	int a[n][m];
	memset(a,0,sizeof(a));
	while(q--)
	{
		int sel,del;
		cin>>sel>>del;
		if(sel)
			for(int i=0;i<n;i++)
				a[i][del-1]=1;
		else
			for(int i=0;i<m;i++)
				a[del-1][i]=1;
	}
	int num=0;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			if(a[i][j]==0)
				num++;
	cout<<num;
	return 0;
}

L1-8 随机输一次 (20)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现要求你编写一个控制赢面的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方意识到你在控制结果,你需要隔 K 次输一次,其中 K 是系统设定的随机数。

输入格式:

输入首先在第一行给出正整数 N(≤10),随后给出 N 个系统产生的不超过 10 的正随机数 { K1​,K2​,⋯,KN​ },数字间以空格分隔。这意味着第 i(i=0,1,⋯,N−1)次输局之后应该隔 Ki+1​ 次再让下一个输局。如果对方出招太多,则随机数按顺序循环使用。例如在样例中,系统产生了 3 个随机数 {2, 4, 1},则你需要:赢 2 次,输 1 次;赢 4 次,输 1 次;赢 1 次,输 1 次;然后再次回到第 1 个随机数,赢 2 次,输 1 次。

之后每行给出对方的一次出招:“ChuiZi”代表“锤子”、“JianDao”代表“剪刀”、“Bu”代表“布”。“End”代表输入结束,这一行不要作为出招处理。输入保证对方至少出了一招。

输出格式:

对每一个输入的出招,按要求输出赢或输局的招式。每招占一行。

输入样例:

3 2 4 1
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
End

输出样例:

Bu
ChuiZi
ChuiZi
ChuiZi
JianDao
Bu
Bu
JianDao
ChuiZi
ChuiZi
ChuiZi
JianDao
JianDao

 个人题解:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n,t=0,i=0;
	int a[11];
	string s;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	while(cin>>s&&s!="End")
	{
		int f=0;   //标记是否要输 
		if(t==a[i])
		{
			f=1;
			t=0;
			i++;
			if(i==n)
				i=0;
		}
		else
			t++;
		if(s=="Bu")
		{
			if(f)
				cout<<"ChuiZi"<<endl;
			else
				cout<<"JianDao"<<endl;
		}
		else if(s=="ChuiZi")
		{
			if(f)
				cout<<"JianDao"<<endl;
			else 
				cout<<"Bu"<<endl;
		}
		else
		{
			if(f)
				cout<<"Bu"<<endl;
			else
				cout<<"ChuiZi"<<endl;
		}	
	}
	return 0;
}

ps:第一次写题解,哪里有写的不好的地方,还望各位大佬指出。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻雾枫林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值