本文主要是介绍可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
姓名
- 王胤皓
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++语言提供了多种位运算操作符与函数,可以方便地进行位运算。
一、位运算的基础概念
- 二进制表示:在计算机中,所有的数据都是以二进制形式表示的。一个二进制位可以表示0或1,多个二进制位可以表示更大的数值。
- 位运算操作符:C++提供了多种位运算操作符,包括与(&)、或(|)、异或(^)、取反(~)等。
- 位运算函数: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+1⌋2,从而得出 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+1⌋2。
接下来进行分类讨论:
- 如果 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+⋯+(l−2),得出答案是 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+⋯+(l−2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+12−2l−2+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+⋯+(l−2),得出答案是 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+⋯+(l−2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+12−2l−2+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+⋯+(l−2),得出答案是 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+⋯+(l−2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+12−2l−2+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,r−1,那么根据约分性质 ( 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+⋯+(l−2),得出答案是 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+⋯+(l−2)),简化后为 r + 1 2 2 − l − 2 + 1 2 2 \frac{r+1}{2}^2-\frac{l-2+1}{2}^2 2r+12−2l−2+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)。
贴图:
给个三连,你的三连是给我创作文章的最大的动力!
这篇关于可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!