天梯 L1合集 C++(10、15、20分)

编程入门 行业动态 更新时间:2024-10-25 09:40:55

<a href=https://www.elefans.com/category/jswz/34/1767727.html style=天梯 L1合集 C++(10、15、20分)"/>

天梯 L1合集 C++(10、15、20分)

L1-002 打印沙漏(20)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

************
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:

************
*****
2

思路:可以不全部用完n,则先找规律算向上取整时的行数
行数x按照一半计算就可以,先把总数分成上三角(n+1)/2,再取sqrt为行数
不难,注意格式
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int n,i,j;char t;cin>>n>>t;int k=(n+1)/2;int x=sqrt(k);for(i=x;i>0;i--){for(j=0;j<x-i;j++)cout<<" ";for(j=0;j<i*2-1;j++)cout<<t;cout<<endl;}for(i=2;i<=x;i++){for(j=0;j<x-i;j++)cout<<" ";for(j=0;j<i*2-1;j++)cout<<t;cout<<endl;}cout<<n-x*x*2+1;return 0;
}

L1-003 个位数统计(15)

给定一个 k 位整数 N,请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:
100311
输出样例:
0:2
1:3
3:1

思路:相当简单,唯一犹豫一下就是用数组还是哈希表,一共十种可能,一个数组搞定

#include<bits/stdc++.h>
using namespace std;
int main()
{string x;cin>>x;vector<int> h(10,0);for(char k:x)h[k-'0']++;for(int i=0;i<10;i++){if(h[i]!=0) cout<<i<<":"<<h[i]<<endl;}
}

L1-005 考试座位号(15)

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

思路:很质朴的查询,选择unordered_map<int,vector>,三个愿望一次满足,这题16位准考号写的时候没考虑先导0,索性过了,下次求问应该开两个map,准考证号用string存
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int n,i;unordered_map<int,vector<long long int>> x;cin>>n;for(i=0;i<n;i++){long long int a,b,c;cin>>a>>b>>c;vector<long long int> k;k.push_back(a);k.push_back(c);x[b]=k;}int q;cin>>q;for(i=0;i<q;i++){int a;cin>>a;cout<<x[a][0]<<" "<<x[a][1]<<endl;}return 0;
}

L1-006 连续因子(20)

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:
输入在一行中给出一个正整数 N(1<N<2^31 )。

输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:
630
输出样例:
3
567

思路:20分原来质数不打表也能过,真不错
我用的除判余0,一定一定注意判数本事不是0
队友用的连续乘法判相等,那就要注意两层循环的边界了,sqrt取得的是下界,边界要加1考虑,可实验例子110是否得到10*11
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{long long int n,i,j,k,st=0;int ans=0,tmp=0;cin>>n;for(i=2;i*i<=n;i++){k=n;j=0;tmp=0;while(k!=0&&k%(i+j)==0){k/=(i+j);tmp++;j++;}if(tmp>ans){st=i;ans=tmp;}}if(ans==0){cout<<1<<endl<<n;}else{cout<<ans<<endl<<st;for(i=1;i<ans;i++)cout<<"*"<<i+st;}return 0;
}

L1-007 念数字(10)

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si。

输入样例:
-600
输出样例:
fu liu ling ling

思路:主打一个荤素搭配×
记住vector初始化不能直接赋值,所以打表用string[]啊啊啊啊
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{string y;string x[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};cin>>y;int i;if(y[0]=='-')cout<<"fu";else cout<<x[y[0]-'0'];for(i=1;i<y.length();i++){cout<<" "<<x[y[i]-'0'];}return 0;
}

L1-009 N个数求和(20)

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24

思路:可以挑战以前看完直接跳过的题了,不错。
分数加减,先通分加减再gcd约分。
注意除0问题,当分子变成0的时候,应该分子0分母1正负0.

代码:

#include<bits/stdc++.h>
using namespace std;vector<int> s(3,0);
void jia(vector<int> &a,vector<int> &b)
{int x=a[0]*a[1]*b[2]+b[0]*b[1]*a[2];int y=a[2]*b[2];if(x==0){s[0]=1;s[1]=0;s[2]=1;return ;}int k=abs(__gcd(x,y));if(x>0)s[0]=1;else s[0]=-1;s[1]=abs(x/k);s[2]=y/k;
}
int main()
{s[0]=1;s[1]=0;s[2]=1;int n,i,j;cin>>n;for(i=0;i<n;i++){string x;vector<int> now(3,0);cin>>x;j=0;if(x[0]=='-'){now[0]=-1;j=1;}else now[0]=1;for(;j<x.length();j++){if(x[j]!='/'){now[1]=now[1]*10+x[j]-'0';}else break;}j++;for(;j<x.length();j++){now[2]=now[2]*10+x[j]-'0';}jia(now,s);//cout<<now[0]<<" "<<now[1]<<" "<<now[2]<<endl;}if(s[1]==0){cout<<0;return 0;}if(s[0]==-1) cout<<"-";if(s[1]>s[2]){cout<<s[1]/s[2];}if(s[1]%s[2]!=0){if(s[1]>s[2]) cout<<" ";cout<<s[1]%s[2]<<"/"<<s[2];}return 0;
}

L1-019 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1
思路:得超过数量才能倒,注意判小于0不是等于0
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int i,n,j,y,j1,y1;cin>>j>>y>>n;j1=j;y1=y;for(i=0;i<n;i++){int a,b,c,d;cin>>a>>b>>c>>d;if(b==d) continue;if(b==a+c)j--;if(d==a+c)y--;if(j<0||y<0) break;}if(j<0){cout<<"A"<<endl<<y1-y<<endl;}elsecout<<"B"<<endl<<j1-j<<endl;return 0;
}

L1-020 帅到没朋友(20)

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

输入格式:
输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:
按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome。

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
输出样例1:
10000 88888 23333
输入样例2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
输出样例2:
No one is handsome

思路:
本来想两个哈希表来去重,后来发现判断的时候为了防止两次选中,直接把询问过的帅的没朋友的人认为是有朋友的加到pyq那个unordered_set里即可。
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{unordered_set<string> pyq;unordered_set<string> ans;int n,i,j;string tmp;cin>>n;for(i=0;i<n;i++){int m;cin>>m;if(m==1) cin>>tmp;else{for(j=0;j<m;j++){cin>>tmp;if(pyq.find(tmp)==pyq.end())pyq.emplace(tmp);}}}cin>>n;int flag=0,fi=0;for(i=0;i<n;i++){cin>>tmp;if(pyq.find(tmp)==pyq.end()){if(fi==0){fi=1;}elsecout<<" ";cout<<tmp;flag=1;pyq.emplace(tmp);}}if(flag==0)cout<<"No one is handsome";return 0;
}

L1-023 输出GPLT(20)

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT…这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL

思路:这个为什么有20分,不理解
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{vector<int> nums(4,0);string x;cin>>x;for(char c:x){if(c=='G'||c=='g') nums[0]++;if(c=='P'||c=='p') nums[1]++;if(c=='L'||c=='l') nums[2]++;if(c=='T'||c=='t') nums[3]++;}int flag=1;//cout<<nums[0]<<nums[1]<<nums[2]<<nums[3];while(1){flag=0;if(nums[0]>0){cout<<"G";nums[0]--;flag=1;}if(nums[1]>0){cout<<"P";nums[1]--;flag=1;}if(nums[2]>0){cout<<"L";nums[2]--;flag=1;}if(nums[3]>0){cout<<"T";nums[3]--;flag=1;}if(flag==0) break;}return 0;
}

L1-025 正整数A+B(15)

题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:
输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:
如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。

输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22. 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla…33
输出样例3:
? + ? = ?

思路:flag是人类的好帮手,注意输出的空格
添加一个坑人的点,不能用cin string,因为可能连续两个空格,而题目要求第一个空格后面的都是第二个串,也就是第二个串其实已经不符合规定了,但是cin的话会按照空格后面的算,有几率是符合规格的。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{string yuan,x1="",x2="";// cin>>x1>>x2;getline(cin,yuan);int i,A=0,B=0,flag1=0,flag2=0;for(i=0;i<yuan.length();i++){if(yuan[i]==' ') break;x1+=yuan[i];}i++;for(;i<yuan.length();i++)x2+=yuan[i];for(char c:x1){if(c>='0'&&c<='9'){A=A*10+c-'0';}   else{flag1=1;break;}if(A>1000){flag1=1;break;}}for(char c:x2){if(c>='0'&&c<='9'){B=B*10+c-'0';}   else{flag2=1;break;}if(B>1000){flag2=1;break;}}if(A<1) flag1=1;if(B<1) flag2=1;if(flag1==0&&flag2==0){cout<<x1<<" + "<<x2<<" = "<<A+B;}else{if(flag1)cout<<"? + ";elsecout<<x1<<" + ";if(flag2)cout<<"? = ?";elsecout<<x2<<" = ?";}
}

更多推荐

天梯 L1合集 C++(10、15、20分)

本文发布于:2024-03-09 04:21:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1723782.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:天梯   合集

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!