第六届团体程序设计天梯赛L1题目总结

一、编码技巧总结

1.C/C++万能头文件

#include <bits/stdc++.h>
using namespace std;

2.int型数据上限:2*10^9 

3.读小数能用double就不要用float,float的精度低

4.控制小数点位数利用printf进行输出。eg:控制小数点后一位且数据类型是double型变量 

printf("%.1lf",n);

5.long long型数据存储整数的上限是9*10^18

6.C++语言中读入一行含有空格的字符串(其中s是已经定义好的字符串变量名)

getline(cin,s)

需要注意的是getline()会读入任何字符(包括回车等),所以在使用getline()函数时要格外注意读入本不该读入的字符。

7.C++中字符串的长度调用size()方法来表示(其中s是已经定义好的字符串变量名):

int len = s.size()

 8.电脑1s大约运算的数量级是10^8(作为自我快速判断代码是否超时的依据)

9.初始数组时尽量初始化为全局变量,因为全局变量的初始值为0,并且main函数中可以分配的空间是有限的,如果将一个大数组定义到一个main函数中可能会报错。所以一般在做题时将非循环变量和数组声明为全局变量。 

二、题目复盘

L1-1 人与神

跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,递归的是神)。本题就请你直接在屏幕上输出这句话。

输入格式:

本题没有输入。

输出格式:

在一行中输出 To iterate is human, to recurse divine.

题解代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    cout << "To iterate is human, to recurse divine." << endl;

    return 0;
}

L1-2 两个小时学完C语言

知乎上有个宝宝问:“两个小时内如何学完 C 语言?”当然,问的是“学完”并不是“学会”。

假设一本 C 语言教科书有 N 个字,这个宝宝每分钟能看 K 个字,看了 M 分钟。还剩多少字没有看?

输入格式:

输入在一行中给出 3 个正整数,分别是 N(不超过 400 000),教科书的总字数;K(不超过 3 000),是宝宝每分钟能看的字数;M(不超过 120),是宝宝看书的分钟数。

题目保证宝宝看完的字数不超过 N。

输出格式:

在一行中输出宝宝还没有看的字数。

输入样例:

100000 1000 72

输出样例:

28000

题解代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    int N,K,M;
    cin >> N >> K >> M;
    cout << N-K*M << endl;

    return 0;
}

L1-3 强迫症

 小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:

输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:

在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808

输出样例 1:

1998-08

输入样例 2:

0510

输出样例 2:

2005-10

输入样例 3:

196711

输出样例 3:

1967-11

题解代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int num;
    scanf("%d",&num);

    if(num < 10000){        
        int a = num / 100;
        int b = num % 100;

        if(a < 10){
            printf("200%d-%02d",a,b);
        }
        else if(a >= 10 && a < 22){
            printf("20%d-%02d",a,b);
        }
        else{
            printf("19%d-%02d",a,b);
        }
    }else{

        int c = num / 100;
        int d = num % 100;
        
        if(d < 10 ){
            printf("%d-0%d",c,d);
        }else{
        printf("%d-%d",c,d);
            }
    }
    
    return 0;
}

 L1-4 降价提醒机器人

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。

输入格式:

输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M。

接下来 N 行,每行有一个实数 Pi​(−1000.0<Pi​<1000.0),表示一条价格记录。

输出格式:

对每一条比设定价格 M 便宜的价格记录 P,在一行中输出 On Sale! P,其中 P 输出到小数点后 1 位。

输入样例:

4 99
98.0
97.0
100.2
98.9

输出样例:

On Sale! 98.0
On Sale! 97.0
On Sale! 98.9

题解代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    int num,initprice;
    double price;
    scanf("%d %d\n",&num,&initprice);
    
    for(int i =1 ; i <= num;i++){
        scanf("%lf\n",&price);

        if(price < initprice){
            printf("On Sale! %0.1lf\n",price);
        }
    }

    return 0;
}

L1-5  大笨钟的心情

输入格式:

输入在一行中给出 24 个 [0, 100] 区间内的整数,依次代表大笨钟在一天 24 小时中,每个小时的心情指数。

随后若干行,每行给出一个 [0, 23] 之间的整数,代表网友询问笨钟这个问题的时间点。当出现非法的时间点时,表示输入结束,这个非法输入不要处理。题目保证至少有 1 次询问。

输出格式:

对每一次提问,如果当时笨钟的心情指数大于 50,就在一行中输出 心情指数 Yes,否则输出 心情指数 No

输入样例:

80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1

输出样例:

52 Yes
20 No
50 No
58 Yes

题解代码 

#include <bits/stdc++.h>
using namespace std;

int main(){
    int modeindex[24];
    int index;
    int x;

    for(int i =0;i < 24;i++){
        scanf("%d",&modeindex[i]);  
    }
    
    while(1){
        scanf("%d\n",&x);

        if(x < 0 || x > 23){ //处理非法数据
            break;
        }

         if(modeindex[x] > 50){
             printf("%d Yes\n",modeindex[x]);
         }else{
             printf("%d No\n",modeindex[x]);
         }
    }

    return 0;
}

L1-6 吉老师的回归

众所周知,吉老师的竞赛水平非常高超,你可以认为他每道题目都会做(事实上也是……)。因此,吉老师会按照顺序看题并做题。但吉老师水平太高了,所以签到题他就懒得做了(浪费时间),具体来说,假如题目的字符串里有  qiandao  或者   easy (区分大小写)的话,吉老师看完题目就会跳过这道题目不做。

现在给定这次天梯赛总共有几道题目以及吉老师已经做完了几道题目,请你告诉大家吉老师现在正在做哪个题,或者吉老师已经把所有他打算做的题目做完了。

提醒:天梯赛有分数升级的规则,如果不做签到题可能导致团队总分不足以升级,一般的选手请千万不要学习吉老师的酷炫行为!

输入格式:

输入第一行是两个正整数 N,M (1≤M≤N≤30),表示本次天梯赛有 N 道题目,吉老师现在做完了 M 道。

接下来 N 行,每行是一个符合题目描述的字符串,表示天梯赛的题目内容。吉老师会按照给出的顺序看题——第一行就是吉老师看的第一道题,第二行就是第二道,以此类推。

输出格式:

在一行中输出吉老师当前正在做的题目对应的题面(即做完了 M 道题目后,吉老师正在做哪个题)。如果吉老师已经把所有他打算做的题目做完了,输出一行   Wo AK le

输入样例 1:

5 1
L1-1 is a qiandao problem.
L1-2 is so...easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so easy.

输出样例 1:

L1-4 is qianDao.

输入样例 2:

5 4
L1-1 is a-qiandao problem.
L1-2 is so easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so!!easy.

输出样例 2:

Wo AK le

题解代码 

#include <bits/stdc++.h>
using namespace std;

int main(){
    
    int number,done;
    string s ;
   
    scanf("%d %d\n",&number,&done);//控制输入字符的规范化,避免getline()读入回车
    
    for(int i = 1;i <= number ; i++){//读入n个字符串
        getline(cin,s);
        int len = s.size();
        bool flag = true;//标志位,值为true表示不包含easy或是qiandao
        
        for(int j = 0 ; j < len ; j++){//遍历读入的字符串      
            if(j+3 < len){//避免数组越界
                if(s[j]=='e' && s[j+1]=='a' && s[j+2]=='s' && s[j+3]=='y')   {//说明包含easy
                flag = false;
                     }         
            }
            
           if(j+6 < len){//避免数组越界
               if(s[j]=='q' && s[j+1]=='i' && s[j+2]=='a' && s[j+3]=='n' && s[j+4]=='d' && s[j+5]=='a' && s[j+6]=='o')   {//说明包含qiandao
               flag = false;
            }      
        }
            
     }
        
        if( flag == true){
            done--;           
        }
 
        if(done == -1){//等于0时是已经做完的最后一道题,再减1,等于-1时正好是现在正在做的题
            cout << s << endl;
          return 0;
        }
        
    }
    
    //做完了的道数 > 需要做的道数
    cout << "Wo AK le" << endl;
    return 0;
   
}

L1-7 天梯赛的善良 

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。

于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。

输入格式:

输入在第一行中给出一个正整数 N(≤2×104),即参赛学生的总数。随后一行给出 N 个不超过 106 的正整数,是参赛学生的能力值。

输出格式:

第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10
86 75 233 888 666 75 886 888 75 666

输出样例:

75 3
888 2

题解代码

#include <bits/stdc++.h>
using namespace std;
const int Maxn = 20000+10;
int a[Maxn],n;

int main(){
    scanf("%d",&n);
    for(int i = 1 ; i <= n ; i++){
        scanf("%d" , &a[i]);
    }
    
    int max = a[1],min = a[1];   
    for(int i = 2; i <= n; i++){
        if(a[i] > max)  max = a[i];
        if(a[i] < min)   min = a[i];
    } 
    
    int cnt1=0/*表示最小值的数量*/,cnt2=0/*表示最大值的数量*/;
    for(int i = 1 ; i <= n ; i++){
        if(a[i] == min) cnt1++;
        if(a[i] == max) cnt2++;
    }
    
    printf("%d %d\n%d %d",min,cnt1,max,cnt2);
    
    return 0;
}

L1-8 乘法口诀数列 

本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:

输入在一行中给出 3 个整数,依次为 a1​、a2​ 和 n,满足 0≤a1​,a2​≤9,0<n≤103。

输出格式:

在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

2 3 10

输出样例:

2 3 6 1 8 6 8 4 8 4

样例解释:

数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

题解代码 

#include <bits/stdc++.h>
using namespace std;
const int Max = 1000;

int main(){
    int num,ji;
    int n[Max];
    scanf("%d %d %d",&n[0],&n[1],&num);
    int number = 2; //表示初始时将乘积放到数组下标为2中去

    for(int i = 0;i < 1000 ;i++){
        ji = n[i] * n[i+1];

        //两个0到9的数相乘,最小为1,最大为81。即一位数或是两位数
        if(ji >= 10) {
            n[number++] = ji / 10;
            n[number++] = ji % 10;
        }else{
            n[number++] = ji;
        }
        
        if(number >= num){
            break;
        }
    }
    
    for(int i = 0; i < num-1;i++){
        printf("%d ",n[i]);
    }
    
    //单独输出最后一项
    printf("%d",n[num - 1]);
    return 0;
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Star_KeyW

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

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

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

打赏作者

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

抵扣说明:

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

余额充值