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);
}