郑轻22级新生C语言周赛(3)——命题人:宋江、张永林、张纪龙复盘

简介: 郑轻22级新生C语言周赛(3)——命题人:宋江、张永林、张纪龙复盘

前言

“现在我不在意的小事,会在未来要了我的命。”

从2022/11/6开始,在csdn记录每日做过的题目的思路与反思;


提示:以下是本篇文章正文内容,下面案例可供参考

问题 A: 法斯特异或

题目描述

给定l,r(l<=r),求l xor l+1 xor l+2 xor l+3 xor ,,, r

输入

输入只有一行,包含两个正整数l(0<l<=1e18), r(0<r<=1e18)

输出

输出答案

样例输入 Copy

1 4

样例输出 Copy

4

看到这个题就知道是要求异或和

但数据范围到了1e18,暴力会超时,所以需要找规律,直接稿纸上列下情况就可以发现规律。我发现的规律比官方题解要低级,是偶数n^(n+1)= 1;然后就计算l-r中有多少个这样的n^(n+1)

#include <iostream>
using namespace std;
int main(){
    long long l , r;
    cin >> l >> r;
    long long res = 0;
    if((r-l)/2 > 0) {
        if((r-l)/2 & 1) res = 0;
        else res = 1;
        if(r % 2 == 0) res ^= r;
    }
    else for(int i = l ;i <= r;i++){
        res ^= i;
    }
    cout << res;
    return 0;
}

刚看到题目,没去看数据范围,直接条件反射暴力超时。

下面是官方题解

可以通过打表找规律发现,从0开始异或到n

如果n%4 == 0,结果是n n%4 == 1,结果是1 n%4 == 2,结果是n+1 n%4 == 3,结果是0

题目问的是从l异或到r, 可以分别求出从0异或到l-1,从0异或到r的结果,然后再异或起来 及a xor a = 0, (a xor (a xor b)) = b,(复习的时候发现看不懂,再做些补充:此处a是0~l-1,b是0~r,a异或b的式子里,有两份0~l-1,把他们单独拿出来看,就是a^a -> 0

long long judge(long long x) {
    int y = x%4; 
    if (!y) return x; 
    if (y==1) return 1; 
    if (y==2) return x+1; 
    return 0;
} 
int main() { 
    long long l, r; 
    scanf("%lld %lld", &l, &r); 
    printf("%lld\n", judge(l-1)^judge(r)); 
    return 0;
}

问题 C: 寻宝猎人

时间限制: 1 Sec  内存限制: 128 MB

提交: 736  解决: 347

题目描述

寻宝猎人Tom发现了一处宝藏,宝藏为一个N * M 的矩阵组成,矩阵的每一个点都包含一个钱袋,钱袋中装有若干金币。现在Tom只想从这个矩阵中拿走一块 3 * 3 的矩阵,请问他能拿走的最大金币数量。

输入

第一行输入两个整数N和M,表示矩阵的长和宽。

接下来N行,每行M个整数,表示钱袋中金币的数量。

3<= N , M <= 200

0<= 钱袋中金币数量 <= 1000

输出

输出一个数字,表示Tom能拿走的最大金币数量。

样例输入 Copy

5 4

0 1 1 5

2 0 9 1

3 1 1 4

1 2 3 4

4 3 1 1

样例输出 Copy

25


纯水题,双循环i,j暴力求当前区域金币数量后与循环外定义的res变量比较。据题意写i,j范围,要据题意res初始化的值,此题的数值均>= 0,可以初始化res为0,部分题目有负值的可以将res初始化为-1e9之类的比数据范围最小值更小的值

#include <iostream>
using namespace std;
int main(){
    int n,m;
    cin >> n >> m;
    int a[210][210];
    for(int i = 0;i < n;i++){
        for(int j = 0; j < m ;j++){
            cin >> a[i][j];
        }
    }
    int res = -999,num;
    for(int i = 0;i < n-2;i++){
        for(int j = 0;j < m-2;j++){
            num = a[i][j]+a[i+1][j]+a[i+2][j]+a[i][j+1]+a[i][j+2]+a[i+1][j+1]+a[i+1][j+2]+a[i+2][j+1]+a[i+2][j+2];
            if(num > res) res = num;
        }
    }
    cout << res;
    return 0;
}

问题 D: 代码格式化

时间限制: 1 Sec  内存限制: 128 MB

提交: 931  解决: 442

题目描述

Madoka最近在开发一款名叫《魔法少女まどか☆マギカ》的游戏。令人苦恼的是,组里的Homura,Sayaka很个性,一个喜欢驼峰命名法,一个喜欢下划线命名法,现在只好拜托你开发一个程序,把所有的下划线命名的变量改为驼峰命名。


输入


第一行一个正整数n(n<=1e3)

后面n行,每行一串字符串,保证如下条件

1.字符串只有字母,数字和下划线组成

2.字符串的第一个字符必定是字母

3.不会有两个及以上的下划线连续出现

4.字符串长度不超过100


输出


输出每行,每行为转换后的字符


样例输入 Copy


4

a_b_c

a_1_c

Add_ads_dd

a

样例输出 Copy


A_B_C

A_1_C

Add_Ads_Dd

A

注意点:


复习补充:(模拟题,在草稿纸上列好要点,再用样例和自己写的样例验证)


1、开头字母大小写转换


2、下划线后判断是否为小写字母,是则转换


这题也是没有好好读题干,调试了6、7遍才过,考虑的情况太少了


没注意开头字母判断和下划线后是数字的情况,还好用例给的情况全面,否则此题必wa

#include <iostream>
using namespace std;
int main(){
    string n;
    int t;
    cin >> t;
    while(t--){
        cin >> n;
    for(int i = 0;n[i];i++){
        if(n[i] == '_' && n[i+1] >= 'a' && n[i+1] <= 'z') n[i+1] -= 'a' - 'A';
        if(i == 0 && n[i] >= 'a' && n[i] <= 'z') n[i] -= 'a' - 'A';
    }
    cout << n << endl;
    }
    return 0;
}

问题 G: 安全出行(思维,模拟)

时间限制: 1 Sec  内存限制: 128 MB

提交: 630  解决: 196

题目描述

有 N 辆汽车在无限长的单行道上行驶,且行驶方向为坐标值增大的方向。每辆车在跑道上开始行驶的位置互不相同,一些车辆的行驶速度可能相同,也可能不同。由于跑道是单行道,十分狭窄,汽车们无法相互超越。当一辆速度很快的汽车追上另一辆汽车时,他必须减速至与另一辆车速度相同以免发生碰撞,并成为同一车队的一员。此时,两辆车可以视为在同一点上。最终,再也没有汽车会撞到(追上)其他汽车了。

求在这种情况下,会剩下多少个车队。


输入


第一行包含整数N。

接下来N行,每行包含一辆车的初始位置和行驶速度。

所有车辆的初始位置各不相同,且是按照递增顺序给出的。

1<= N <= 1e5

初始位置范围[0 , 1e9]

行驶速度范围[0 , 1e9]


输出


输出一个整数,表示最终剩下的车队数量。


样例输入 Copy


5

0 1

1 2

2 3

3 2

6 1

样例输出 Copy


2

#include <iostream>
using namespace std;
struct car{
    int pst,v;
}a[190000];
int main(){
    int n;
    cin >> n;
    for(int i = 0;i < n;i++){
        cin >> a[i].pst >> a[i].v;
    }
    int num = 0,vv = a[n-1].v;
    for(int i = n-1;i >= 0;i--){
        if(a[i].v <= vv){
            vv = a[i].v;
            num++;
        }
    }
    cout << num;
    return 0;
}

车的位置是从小到大的,所以车的位置可以不用看,(比赛时没想到这点,甚至条件反射写了个bool准备sort结构体数组(常用套路))(但是能归入套路的话可以节省思考时间)


直接用数组存车速,前边的车决定了车速上限,所以反向遍历,比较车速,后车车速<= 速度上限,则车队加一,同时更新速度上限。


卡了一小时的题,re七发 ,ce1发


1e5错当10000,老毛病了

问题 H: 统计数字

时间限制: 1 Sec  内存限制: 128 MB

提交: 1525  解决: 839

题目描述

输入N个数,分别统计其中负数的个数、0的个数、正数的个数。


输入


第一行输入整数N。

接下来输入N个整数。

1 <= N <= 10000


输出


输出三行,每行一个整数。第一行为负数的个数,第二行为0的个数,第三行为正数的个数。


样例输入 Copy


5

8 9 -1 0 0

样例输出 Copy


1

2

2

存、遍历、判断and计数、输出


格式错误1发,想当然的以为三个输出数据之间用空格隔开就好,交之前没好好看输出格式

总结

做的好的地方:

1、A题没思路的时候通过从头到尾将题面看三遍的方法获得了思路

做的不好的地方:

1、跟榜做题顺序错误


2、题面、样例和编译选项不仔细看,tle一发,格式错误一发,ce一发;


3、卡题时没有及时转换战场,浪费了很多时间


4、情况考虑不充分


反思:


1、声明变量类型前至少要把数据的范围看一遍,交题前至少把样例输出格式看一遍。


2、跟榜时好好确认通过人数和通过率,同时不能无脑跟榜,想好题目思路确认可以实现再开敲代


码;


3、写题前列出题目要求与注意点


4、交题前尝试hack自己代码,否则若错误被罚时得不偿失


目录
相关文章
|
测试技术 C语言
C语言--离散数学实验--命题逻辑及其应用(实验报告下载)
C语言--离散数学实验--命题逻辑及其应用(实验报告下载)
|
人工智能 C语言
大一新生必会的c语言五子棋!PVP,PVE,EVE模式都有,还有智能的AI部分,复盘等内容!一看就会的五子棋教程,确定不来看看吗?
大一新生必会的c语言五子棋!PVP,PVE,EVE模式都有,还有智能的AI部分,复盘等内容!一看就会的五子棋教程,确定不来看看吗?
141 0
|
C语言
大一计算机新生c语言中关于一道数组思考延伸出来的问题
疑问:a数组中不是1 2 0 6 0吗,为什么输出结果是1206?
93 0
|
算法 NoSQL 关系型数据库
大一新生先学C语言编程还是先学C语言的数据结构和算法?
大一新生先学C语言编程还是先学C语言的数据结构和算法?
209 0
|
Java Unix Linux
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?(1)
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?
406 0
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?(1)
|
算法 机器人 程序员
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?(2)
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?
194 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
11天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
27 6
|
1月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
36 10
|
24天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。