可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

本文主要是介绍可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

姓名

  • 王胤皓

T1 题解

T1 题面

T1 思路

样例输入就是骗人的,其实直接输出就可以了,输出 Hello 2024,注意,中间有一个空格!

T1 代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){cout<<"Hello 2024";return 0;
}

T2 题解

T2题面

T2 思路

计算 2 x 2^x 2x 次方,可以使用 C++ 中自带的位运算。

接下来将详细介绍位运算:
位运算是计算机中一种常用的运算方式,它直接对二进制数据进行操作。C++语言提供了多种位运算操作符与函数,可以方便地进行位运算。

一、位运算的基础概念

  1. 二进制表示:在计算机中,所有的数据都是以二进制形式表示的。一个二进制位可以表示0或1,多个二进制位可以表示更大的数值。
  2. 位运算操作符:C++提供了多种位运算操作符,包括与(&)、或(|)、异或(^)、取反(~)等。
  3. 位运算函数:C++提供了一些位运算函数,包括位移函数(<<、>>)、位计数函数(__builtin_popcount)、最低位函数(__builtin_ffs)等。

二、位运算操作符
4. 与运算(&):对两个数的二进制位进行逐位比较,若两个位均为1,则结果为1;否则为0。例如,3 & 5的结果是1。
5. 或运算(|):对两个数的二进制位进行逐位比较,若两个位中至少有一个为1,则结果为1;否则为0。例如,3 | 5的结果是7。
6. 异或运算(^):对两个数的二进制位进行逐位比较,若两个位不相同,则结果为1;否则为0。例如,3 ^ 5的结果是6。
7. 取反运算(~):对一个数的二进制位进行逐位取反,即0变为1,1变为0。
例如,~3的结果是-4(以补码形式表示)。
8. 左移运算(<<):将一个数的二进制位向左移动指定的位数,相当于乘以2的指定次幂。例如,3 << 2的结果是12。
9. 右移运算(>>):将一个数的二进制位向右移动指定的位数,相当于除以2的指定次幂。例如,8 >> 2的结果是2。

三、位运算的应用
11. 位运算与(&)常用于掩码操作、判断奇偶性等。例如,可以用掩码操作实现只保留某些位。
12. 位运算或(|)常用于设置某些位为1。例如,可以用位运算将某些位设置为1,而保持其他位不变。
13. 位运算异或(^)常用于交换两个数的值、判断两个数的符号是否相同等。
14. 位运算取反(~)常用于将整数取反。
15. 位运算左移(<<)和右移(>>)常用于对整数进行乘法或除法的优化。例如,一个数左移一位相当于乘以2,右移一位相当于除以2。

四、位运算的特点
16. 位运算是直接对二进制数据进行操作,因此速度较快。
17. 位运算在一些特定场景下可以实现高效的算法,如位图算法、哈希表实现等。
18. 位运算可以用于优化算法性能,减少空间占用。

五、注意事项
19. 在使用位运算时,需要注意位运算的优先级与结合性,可以使用括号来明确运算顺序。

总结:位运算是C++中一种常用的运算方式,可用于对二进制数据进行操作。C++提供了多种位运算操作符和函数,方便进行位运算。位运算具有速度快、可以实现高效算法、可以优化性能的特点。在使用位运算时,需要注意操作符优先级和结合性。

所以直接输出 2 n 2^n 2n 也就是 1 < < n 1<<n 1<<n

(我绝不会告诉你有人还用快速幂、pow和for循环)

T2 代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){int n;cin>>n;cout<<(1<<n);return 0;
}

T3 题解

T3 题面

T3 O ( n ) O(n) O(n) 思路

暴力枚举。

遍历 l l l r r r,然后如果 i i i 为奇数,那么计数器加上 i i i,最后进行输出即可。

T3 O ( n ) O(n) O(n) 代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){int l,r;cin>>l>>r;int sum=0;for(int i=l;i<=r; i++){if(i&1) sum+=i;}cout<<sum;return 0;
}

T3 O(1) 思路

前置知识(干货):因为 1 + 3 + 5 + 7 + 9 = ⌊ 9 + 1 2 ⌋ 2 1+3+5+7+9=\lfloor \frac{9+1}{2}\rfloor^2 1+3+5+7+9=29+12,从而得出 1 + 3 + 5 + ⋯ + n ( n m o d 2 = 1 ) = ⌊ n + 1 2 ⌋ 2 1+3+5+\cdots+n(n\mod 2=1)=\lfloor \frac{n+1}{2}\rfloor^2 1+3+5++n(nmod2=1)=2n+12

接下来进行分类讨论:

  • 如果 l l l r r r 都是奇数,那么根据约分性质 ( a + b + c + d ) − ( a + b ) = c + d (a+b+c+d)-(a+b)=c+d (a+b+c+d)(a+b)=c+d,就能得出 1 + 3 + 5 + ⋯ + r 1+3+5+\cdots +r 1+3+5++r 1 + 3 + 5 + ⋯ + ( l − 2 ) 1+3+5+\cdots +(l-2) 1+3+5++(l2),得出答案是 1 + 3 + 5 + ⋯ + r − ( 1 + 3 + 5 + ⋯ + ( l − 2 ) ) 1+3+5+\cdots +r-(1+3+5+\cdots +(l-2)) 1+3+5++r(1+3+5++(l2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+122l2+12
    Q:为什么 l l l 要减 2 2 2?
    A:如果不减的话,那么就会少算一个 l l l
  • 如果 l l l 是奇数, r r r 是偶数,那么要把 r r r 1 1 1,然后就可以和 l l l r r r 都是奇数的计算就是一样的了,就能得出 1 + 3 + 5 + ⋯ + r 1+3+5+\cdots +r 1+3+5++r 1 + 3 + 5 + ⋯ + ( l − 2 ) 1+3+5+\cdots +(l-2) 1+3+5++(l2),得出答案是 1 + 3 + 5 + ⋯ + r − ( 1 + 3 + 5 + ⋯ + ( l − 2 ) ) 1+3+5+\cdots +r-(1+3+5+\cdots +(l-2)) 1+3+5++r(1+3+5++(l2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+122l2+12
    Q:为什么 l l l 要减 2 2 2?
    A:如果不减的话,那么就会少算一个 l l l
  • 如果 l l l 是偶数, r r r 都是奇数,把 l + 1 l+1 l+1 ,然后就可以和 l l l r r r 都是奇数的计算就是一样的了,那么根据约分性质 ( a + b + c + d ) − ( a + b ) = c + d (a+b+c+d)-(a+b)=c+d (a+b+c+d)(a+b)=c+d,就能得出 1 + 3 + 5 + ⋯ + r 1+3+5+\cdots +r 1+3+5++r 1 + 3 + 5 + ⋯ + ( l − 2 ) 1+3+5+\cdots +(l-2) 1+3+5++(l2),得出答案是 1 + 3 + 5 + ⋯ + r − ( 1 + 3 + 5 + ⋯ + ( l − 2 ) ) 1+3+5+\cdots +r-(1+3+5+\cdots +(l-2)) 1+3+5++r(1+3+5++(l2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+122l2+12
    Q:为什么 l l l 要减 2 2 2?
    A:如果不减的话,那么就会少算一个 l l l
  • 如果 l l l r r r 都是偶数,那么结合第二项和第三项,在进行第一项的操作就可以了,就是 l + 1 , r − 1 l+1,r-1 l+1,r1,那么根据约分性质 ( a + b + c + d ) − ( a + b ) = c + d (a+b+c+d)-(a+b)=c+d (a+b+c+d)(a+b)=c+d,就能得出 1 + 3 + 5 + ⋯ + r 1+3+5+\cdots +r 1+3+5++r 1 + 3 + 5 + ⋯ + ( l − 2 ) 1+3+5+\cdots +(l-2) 1+3+5++(l2),得出答案是 1 + 3 + 5 + ⋯ + r − ( 1 + 3 + 5 + ⋯ + ( l − 2 ) ) 1+3+5+\cdots +r-(1+3+5+\cdots +(l-2)) 1+3+5++r(1+3+5++(l2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+122l2+12
    Q:为什么 l l l 要减 2 2 2?
    A:如果不减的话,那么就会少算一个 l l l

T3 O(1) 代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){int l,r;cin>>l>>r;if(r&1==0) r--;l--;if(l&1==0) l--;cout<<(((r+1)/2)*((r+1)/2)-((l+1)/2)*((l+1)/2))<<endl;return 0;
}

T4 题解

T4 题面

在这里插入图片描述

T4 思路

遍历字符串,如果 s i s_i si s i + 1 s_{i+1} si+1 都是 l,那么计数器 + 1 +1 +1,然后把 i i i 也加 1 1 1,防止重复计算。

判断 s i = = ′ d ′ s_i=='d' si==d 并且 s i + 1 = = ′ r ′ s_{i+1}=='r' si+1==r 并且 s i + 2 = = ′ a ′ s_{i+2}=='a' si+2==a 并且 s i + 3 = = ′ g ′ s_{i+3}=='g' si+3==g 并且 s i + 4 = = ′ o ′ s_{i+4}=='o' si+4==o 并且 s i + 5 = = ′ n ′ s_{i+5}=='n' si+5==n,可以使用 string 中的 substr 函数简化,函数格式:字符串名字.substr(截取字符串开始下标,截取长度),直接判断是否为 d r a g o n dragon dragon 就可以了。那么计数器也 + 1 +1 +1,然后 i + 5 i+5 i+5,防止重复计算。

T4 代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){int n;cin>>n;while(n--){string s;cin>>s;int cnt=0;for(int i=0; i<s.size()-1; i++){if(s[i]=='l'&&s[i+1]=='l'){i++;cnt+=2;}if(s.substr(i,6)=="dragon") cnt++,i+=5;}cout<<cnt<<endl;}return 0;
}

赛后总结

T1,T2,T3,T4真的都太水了,太简单了,前三题时间复杂度都可以做到 O ( 1 ) O(1) O(1),第四题最坏情况下是 O ( T × n ) O(T\times n) O(T×n)

贴图:
在这里插入图片描述
给个三连,你的三连是给我创作文章的最大的动力!

这篇关于可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698226

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的