2025年天梯赛—普及赛(摸底赛) 1-9题

R7-1 嫑废话上代码

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<bits/stdc++.h>
using namespace std;
int main()
{
	cout<<"Talk is cheap. Show me the code.";
    return 0;
}

R7-2 心理阴影面积

这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。

现给出红色拐点的坐标 (x,y),要求你算出这个心理阴影面积。

输入格式:

输入在一行中给出 2 个不超过 100 的正整数 x 和 y,并且保证有 x>y。这里假设横、纵坐标的最大值(即截止日和最终完成度)都是 100。

输出格式:

在一行中输出心理阴影面积。

友情提醒:三角形的面积 = 底边长 x 高 / 2;矩形面积 = 底边长 x 高。嫑想得太复杂,这是一道 5 分考减法的题……

输入样例:

90 10

输出样例:

4000

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int x,y;
int s1,s2,s3,s4;
int main()
{
	cin>>x>>y;
	s1=(100*100)/2; //最大的三角形
	s2=(x*y)/2;
	s3=((100-x)*(100-y))/2;
	s4=(100-x)*y;
	cout<<s1-s2-s3-s4;
    return 0;
}

R7-3 小孩子才做选择,大人全都要

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

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

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

输入格式:

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

输出格式:

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

输入样例 1:

12 18

输出样例 1:

18 30
^_^

输入样例 2:

12 -18

输出样例 2:

12 0
T_T

代码 :

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m;
int main()
{
	cin>>n>>m;
	if(n>0&&m>0)// 都为正
	{
		cout<<max(n,m)<<" "<<n+m<<endl;//找出最大值,后相加
		cout<<"^_^";
	}
	else if(n<0&&m<0) //都为负
	{
		cout<<0<<" "<<0<<endl;
		cout<<"-_-";
	}
	else // 一正一负
	{
		cout<<max(n,m)<<" "<<max(0,n+m)<<endl;  //找出最大值,看相加的和是否大于0
		cout<<"T_T";
	}
    return 0;
}

R7-4 寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

输入格式:

输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。

输出格式

在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。

输入样例:

888 666 123 -233 250 13 250 -222

输出样例:

5

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int t,n;
int main()
{
	while(++t) // 死循环
	{
		cin>>n;
		if(n==250) // 如果是250,就输出;
		{
			cout<<t;
			return 0;
		}
	}
    return 0;
}

R7-5 剪切粘贴

使用计算机进行文本编辑时常见的功能是剪切功能(快捷键:Ctrl + X)。请实现一个简单的具有剪切和粘贴功能的文本编辑工具。

工具需要完成一系列剪切后粘贴的操作,每次操作分为两步:

  • 剪切:给定需操作的起始位置和结束位置,将当前字符串中起始位置到结束位置部分的字符串放入剪贴板中,并删除当前字符串对应位置的内容。例如,当前字符串为 abcdefg,起始位置为 3,结束位置为 5,则剪贴操作后, 剪贴板内容为 cde,操作后字符串变为 abfg。字符串位置从 1 开始编号。
  • 粘贴:给定插入位置的前后字符串,寻找到插入位置,将剪贴板内容插入到位置中,并清除剪贴板内容。例如,对于上面操作后的结果,给定插入位置前为 bf,插入位置后为 g,则插入后变为 abfcdeg。如找不到应该插入的位置,则直接将插入位置设置为字符串最后,仍然完成插入操作。查找字符串时区分大小写。

每次操作后的字符串即为新的当前字符串。在若干次操作后,请给出最后的编辑结果。

输入格式:

输入第一行是一个长度小于等于 200 的字符串 S,表示原始字符串。字符串只包含所有可见 ASCII 字符,不包含回车与空格。

第二行是一个正整数 N (1≤N≤100),表示要进行的操作次数。

接下来的 N 行,每行是两个数字和两个长度不大于 5 的不包含空格的非空字符串,前两个数字表示需要剪切的位置,后两个字符串表示插入位置前和后的字符串,用一个空格隔开。如果有多个可插入的位置,选择最靠近当前操作字符串开头的一个。

剪切的位置保证总是合法的。

输出格式:

输出一行,表示操作后的字符串。

输入样例:

AcrosstheGreatWall,wecanreacheverycornerintheworld
5
10 18 ery cor
32 40 , we
1 6 tW all
14 18 rnerr eache
1 1 e r

输出样例:

he,allcornetrrwecaneacheveryGreatWintheworldAcross

代码1: 

#include<iostream>
using namespace std;
int t,n,m;
string s,l,r,st,str;
bool ch(int x)
{
	if(x+1<l.size()) return 0; //找不到右边应该插入的位置
	if(str.size()-(x+1)<r.size()) return 0; //找不到左边应该插入的位置
	for(int i=x,j=l.size()-1;j>=0;j--,i--) if(str[i]!=l[j]) return 0;
	for(int i=x+1,j=0;j<r.size();j++,i++) if(str[i]!=r[j]) return 0;
	return 1;
}
int main()
{
	cin>>s;
	cin>>t; 
	while(t--)
	{
		cin>>n>>m>>l>>r;
		st="",str=""; // 
		for(int i=0;i<s.size();i++)
		{
			if(i+1>=n&&i+1<=m) st+=s[i]; //要剪切的部分给st
			else str+=s[i]; //剩下的部分给str
		}
		if(str.size()==0) //如果剪切的是整个字符串
		{
			s=st; 
			continue;
		}
		int pos=str.size()-1; 
		for(int i=0;i<str.size();i++)
		{
			if(ch(i))
			{
				pos=i;
				break;
			}
		}
		s="";
		for(int i=0;i<str.size();i++) //结果
		{
			s+=str[i];
			if(pos==i) s+=st;
			
		}
		
	}
	cout<<s<<endl;
    return 0;
}

代码2: 

​
// 代码2:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef long long ll;
ll all[N];
int n;
int main() 
{
	string s;
	cin>>s;
	int n; 
	cin>>n;
	for(int i=1; i<= n;i++)
	{
		int l,r,num=0;
		cin>>l>>r;
		l--;
		r--;
		string a,b;
		cin>>a>>b;
		string str=a+b;	//插入的字符串是字符串a加上字符串b 
		string st=s.substr(l,r-l+1);//剪切字符串
		s.erase(l,r-l+1);	// 删除字符串 
		num = s.find(str); //找到要插入字符串的下标 
		if(num!=-1)	s=s.substr(0,num+a.size())+st+s.substr(num + a.size());	//说明这个num下标在字符串内 
		else s+= st;//说明这个num下标在字符串末尾 
	}
	cout<<s;
    return 0;
}

​

R7-6 幸运彩票

彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

输入格式:

输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。

输出格式:

对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.

输入样例:

2
233008
123456

输出样例:

You are lucky!
Wish you good luck.

代码: 

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int t,n,m,x,y;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n; 
		x=0,y=0;
        // 最长只有6位
		x+=n/100000+n/10000%10+n/1000%10; //前3位 
		y+=n/100%10+n/10%10+n%10; //后3位
		if(x==y) cout<<"You are lucky!"<<endl;
		else cout<<"Wish you good luck."<<endl;
	}
    return 0;
}

R7-7 智能管家

人上了年纪,记性就会变差,时常不得不翻箱倒柜找东西。智能照护中心现在请你做一个简单的智能管家程序,把老人家里的东西逐一编号,放进若干个收纳箱里。当然收纳箱也是有编号的,你的

程序要记录下哪个东西放在哪个收纳箱里。当老人问起某几件东西时,你的程序要告诉老人家,东西分别放在哪些箱子里。

输入格式:

输入在第一行中给出 2 个正整数:N(≤105)是老人家藏物品的数量(所有物品从 1 到 N 编号);M(≤104 且 M<N)是收纳箱的数量(所有收纳箱从 1 到 M 编号)。随后一行给出 N 个正整数,第 i 个数字就是编号为 i 的物品所存放的收纳箱的编号。

接下来是老人的查询数据:首先在一行中给出正整数 K(≤100),为查询次数;随后 K 行,每行给出一系列要查找的物品的编号,以 0 结尾(这个数字不要处理)。

题目保证每行中的查询编号都无重复,每次至少查询一件物品,并且同一行的数字间以空格分隔。

输出格式:

对每一次查询,在一行中按照收纳箱编号的升序输出存放了被查物品的收纳箱,并且同时输出该箱内有多少件被查的物品。输出格式为 Bi-k,其中 i 是箱子编号,k 是物品个数。两只箱子的信息间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10 5
3 4 4 1 1 5 3 3 3 4
2
8 1 2 5 0
6 0

输出样例:

B1-1 B3-2 B4-1
B5-1

代码: 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,x,y,a[N],k;
map<int,int>cnt;
bool f; //判断是否是第一个,如果不是,后面都要在前面加上空格
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) //所有物品从1到n编号
	{
		scanf("%d",&x);  //藏物品的数量
		a[i]=x;
	}
	cin>>k;
	while(k--)
	{
		cnt.clear();
		while(scanf("%d",&y),y) //物品的编号
		{
			cnt[a[y]]++; //物品的编号的个数
			
		}
		f=1;// 第一个
		for(auto c:cnt)
		{
			if(f) //
			{
				cout<<"B"<<c.first<<"-"<<c.second;
				f=0;
			 } 
			else cout<<" "<<"B"<<c.first<<"-"<<c.second;
		}
		cout<<endl;
	}
    return 0;
}

R7-8 521序列

所谓“521 序列”是指将一个原始整数序列 S 中的每个数字分别乘以 5、2、1 后形成的序列,例如 S= { 5, 2, 1 } 时,其对应的 521 序列就是 { 25, 10, 5, 10, 4, 2, 5, 2, 1 } —— 这里我们不要求这个序列一定具有某种顺序,即 521 序列中元素的顺序是可以打乱的。给定 S 后,计算其对应的 521 序列是很简单的。但给定一个 521 序列,恢复其对应的原始序列 S 就略微复杂一点了。本题就请你恢复任意给定的 521 序列的原始序列。

输入格式:

输入第一行给出正整数 N(<105),为 521 序列的长度。随后一行给出 N 个整数,即给定的 521 序列。所有数字的绝对值不超过 105,以空格分隔。

输出格式:

在一行中按照非递增序输出 521 序列对应的原始序列。数字间以 1 个空格分隔,行首尾不得有多余空格。

题目保证原始序列是存在的。

输入样例:

12
1 -5 10 -1 2 4 5 -2 5 25 10 2

输出样例:

5 2 1 -1

代码: 

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int t,n,x,a[N],k,b[N];
vector<int>ans;
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		if(x>=0) a[x]++; //大于0的数 
		else b[abs(x)]++; //负数
	}
//    for (int i = 1; i <= 10; i ++ ) cout << a[i] << " "; cout <<endl;
	a[0] /= 3; //如果原数组出显3个0;
	while (a[0] -- ) ans.push_back(0); //插入·0;
	for(int i=1;i<=1e5;i++)
	{
		if(a[i]>=0) //1 2 5的倍数
		{
			a[i*2]-=a[i],a[i*5]-=a[i];
			while(a[i]--) ans.push_back(i);
		}
		if(b[i]>=0)1 2 5的倍数
		{
			b[i*2]-=b[i],b[i*5]-=b[i];
			while(b[i]--) ans.push_back(-i);
		}
	}
	sort(ans.begin(),ans.end(),cmp); //cmp 是负责降序
	for(int i=0;i<ans.size();i++)
	{
		if(i==0) cout<<ans[i]; 
		else cout<<" "<<ans[i]; // 第一个开始,后面都要在前面加上空格
	}
    return 0;
}

R7-9 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2

代码: 

#include<bits/stdc++.h>
using namespace std;
const int N=100;
typedef struct Tree *BinTree;
typedef int ElementType;
int n,qian[100],zhong[100];// 结点个数,前序数组和中序数组
struct Tree
{
    ElementType Data;
    BinTree left;
    BinTree right;
};//建立树的结构体

BinTree Creat(int q,int z,int n)
{
	
    BinTree T;
    int i; 
    if(n<=0) return T=NULL;
    else 
    {
        T=(BinTree)malloc(sizeof(struct Tree));
        T->Data=qian[q];//这个结点存储前序数字
        for(i=0;qian[q]!=zhong[i+z];i++); //寻找左侧有多少个结点
        T->left=Creat(q+1,z,i); //进入左侧,每次循环证明前序的这个数字已经被找到,就向后进行一位
        T->right=Creat(q+i+1,z+i+1,n-i-1);//进入右侧
    }
    return T;//返回根结点
}
void Level(BinTree T) //比较经典的采用数组队列的层序遍历
{
    BinTree Q,a[1000];
    bool c=0;// 判断是否是第一个
    int front=0,tail=0;
    if(T) a[++tail]=T;
    while(front!=tail)
    {
        Q=a[++front];
        if(c==0) //第一个前面不加空格
        {
//            cout<<Q->Date;
			printf("%d",Q->Data);
            c=1;
        }
        else printf(" %d",Q->Data);
        if(Q->right) a[++tail]=Q->right; //层序遍历一般都是先左结点后右结点
        if(Q->left) a[++tail]=Q->left;
        
    }
}
int main()
{
    BinTree T;
    cin>>n;
    for(int i=0;i<n;i++) scanf("%d",&zhong[i]);
    for(int i=0;i<n;i++) scanf("%d",&qian[i]);
    T=Creat(0,0,n);
    Level(T);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值