天梯赛题解合集
团体程序设计天梯赛-练习集 (L1-001 - L1-012)
团体程序设计天梯赛-练习集 (L1-013 - L1-024)
团体程序设计天梯赛-练习集 (L1-025 - L1-036)
团体程序设计天梯赛-练习集 (L1-037 - L1-048)
L1-013 计算阶乘和 阶乘
样例
输入
3
输出
9
思路
在循环求阶乘得过程中计算阶乘的和
Ac代码
#include<bits/stdc++.h>
using namespace std;
int jc,n,sum;
int main(){
scanf("%d",&n);
jc=1,sum=0;
for(int i=1;i<=n;i++){
jc*=i; // i的阶乘
sum+=jc; // 加上i的阶乘
}
printf("%d\n",sum);
return 0;
}
L1-014 简单题 输出题
样例
输入
输出
This is a simple problem.
思路
Ac代码
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"This is a simple problem."<<endl;
return 0;
}
L1-015 跟奥巴马一起画方块 模拟
样例
输入
10 a
输出
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int n,i,j;
char c;
int main(){
scanf("%d %c",&n,&c); // 正方形边长N 给定字符C
for(i=1;i<=(n+1)/2;i++){ // 行数实际上是列数的50%
for(j=1;j<=n;j++)
printf("%c",c);
cout<<endl;
}
return 0;
}
L1-016 查验身份证 模拟
样例
样例1:
输入
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出
12010X198901011234
110108196711301866
37070419881216001X
样例2:
2
320124198808240056
110108196711301862
All passed
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int n,sum,i;
string str;
int rig[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; // 权重
char m[]="10X98765432"; // 校验码
bool flag,f;
int main(){
scanf("%d",&n); // 身份证号码的个数
getchar(); // 吸收换行
flag=true;
while(n--){
sum=0;
getline(cin,str); // 输入1个18位身份证号码
for(i=0;i<18;i++) sum+=(str[i]-'0')*rig[i]; // 对前17位数字加权求和
sum%=11; // 对11取模
if(str[17]!=m[sum]) { // Z值与校验码M的值不匹配
flag=false;
cout<<str<<endl;
}
}
if(flag) printf("All passed\n");
return 0;
}
L1-017 到底有多二 模拟
样例
输入
-13142223336
输出
81.82%
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
string str;
int num,num_2,i; //2的个数
double flag_1,flag_2,ans; //分别记录负数和偶数
int main(){
getline(cin,str);// 不超过50位的整数 用字符串读取
num=num_2=0;// 初始化 2的个数 与 位数
flag_1=flag_2=1;
for(i=0;i<str.size();i++){
num++;
if(str[i]=='-') flag_1=1.5,num--; // 这个数是负数,则程度增加0.5倍
if(str[i]=='2') num_2++; // 计算2的个数
}
if((str[str.size()-1]-'0')%2==0) flag_2=2; // 是个偶数,则再增加1倍
ans = (double)num_2/num*flag_1*flag_2;
printf("%.2lf%\n",ans*100);
}
L1-018 大笨钟 模拟
样例
样例1:
输入
19:05
输出
DangDangDangDangDangDangDangDang
样例2:
输入
07:05
输出
Only 07:05. Too early to Dang.
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int hh,mm,num;
bool flag;
int main(){
scanf("%d:%d",&hh,&mm);// hh是小时 mm是分钟
if(hh<12 || (hh==12&&mm==0)) // 午夜00:00到中午12:00期间,笨钟是不敲的
printf("Only %02d:%02d. Too early to Dang.\n",hh,mm);
else{
num=hh-12;
if(mm>0) num+=1; // 如果过了整点,就敲下一个整点数
while(num--) printf("Dang");
printf("\n");
}
return 0;
}
L1-019 谁先倒 模拟
样例
输入
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
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int maxA,maxB,n;
int Ahan,Ahua,Bhan,Bhua,sum;;
int numA,numB;
int main(){
scanf("%d%d%d",&maxA,&maxB,&n); // 甲、乙两人的酒量,n轮划拳
numA=numB=0; // 记录甲、乙两人喝的酒
while(n--){
scanf("%d%d%d%d",&Ahan,&Ahua,&Bhan,&Bhua);// 甲喊 甲划 乙喊 乙划
sum=Ahan+Bhan;// 两人喊出的数字之和
if(Ahua!=Bhua){// 两人不同输
if(Ahua==sum) numA++; // 甲输
if(Bhua==sum) numB++; // 乙输
}
if(numA>maxA) { // 甲倒下
printf("A\n%d\n",numB);
break;
}
if(numB>maxB) { // 乙倒下
printf("B\n%d\n",numA);
break;
}
}
return 0;
}
L1-020 帅到没朋友 STL-set
样例
样例1:
输入
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
输出
10000 88888 23333
样例2:
输入
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
输出
No one is handsome
思路
用set
存有朋友圈的,count(ID)
查询ID
是否有朋友圈。
Ac代码
#include<bits/stdc++.h>
using namespace std;
int n,k,m,x,i;
set<int> s,se;
vector<int> v; // 用于辅助输出
int main(){
scanf("%d",&n); // 朋友圈的个数
while(n--){
scanf("%d",&k); // 朋友圈中的人数
for(i=0;i<k;i++){
scanf("%d",&x);
if(k==1) break; // 只有一个人的朋友圈=没朋友
s.insert(x); // 有朋友的ID都加入s
}
}
scanf("%d",&m); // 待查询的人数
while(m--){
scanf("%d",&x); // 待查询的ID
if(!s.count(x) && !se.count(x))
v.push_back(x); // 没有朋友 并且 没被查询过的ID加入输出列表
se.insert(x); // 查询过的ID加入se
}
if(v.size()==0) printf("No one is handsome\n"); // 输出列表为空
for(i=0; i<v.size(); i++){// 一定要输出5位数
if(i<v.size()-1) printf("%05d ",v[i]);
else printf("%05d\n",v[i]);
}
return 0;
}
L1-021 重要的话说三遍 输出题
样例
输入
输出
I'm gonna WIN!
I'm gonna WIN!
I'm gonna WIN!
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int main(){
printf("I'm gonna WIN!\n");
printf("I'm gonna WIN!\n");
printf("I'm gonna WIN!");
return 0;
}
L1-022 奇偶分家 模拟
样例
输入
9
88 74 101 26 15 0 34 22 77
输出
3 6
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int num_j,num_o;
int main(){
scanf("%d",&n);
num_j=num_o=0;
while(n--){
scanf("%d",&m);
if(m%2==1) num_j++;
else num_o++;
}
printf("%d %d\n",num_j,num_o);
return 0;
}
L1-023 输出GPLT 模拟
样例
输入
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出
GPLTGPLTGLTGLGLL
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int i;
int num[5];
string str;
int main(){
getline(cin,str);
num[0]=num[1]=num[2]=num[3]=0;
for(i=0;i<str.size();i++){
if(str[i]=='G'||str[i]=='g') num[0]++;
if(str[i]=='P'||str[i]=='p') num[1]++;
if(str[i]=='L'||str[i]=='l') num[2]++;
if(str[i]=='T'||str[i]=='t') num[3]++;
}
while(num[0]+num[1]+num[2]+num[3]){
if(num[0]) printf("G"),num[0]--;
if(num[1]) printf("P"),num[1]--;
if(num[2]) printf("L"),num[2]--;
if(num[3]) printf("T"),num[3]--;
}
printf("\n");
return 0;
}
L1-024 后天 模拟
样例
输入
3
输出
5
思路
按照题面模拟即可
Ac代码
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
scanf("%d",&n);
if(n+2<=7) printf("%d\n",n+2);
else printf("%d\n",n-5);
return 0;
}