• 网课:第二章模拟、枚举与贪心---兔子的区间密码


    链接:登录—专业IT笔试面试备考平台_牛客网
    来源:牛客网
     

    题目描述

    有一只可爱的兔子被困在了密室了,密室里有两个数字,还有一行字:
    只有解开密码,才能够出去。
    可爱的兔子摸索了好久,发现密室里的两个数字是表示的是一个区间[L,R]
    而密码是这个区间中任意选择两个(可以相同的)整数后异或的最大值
    比如给了区间[2,5] 那么就有2 3 4 5这些数,其中 2 xor 5=7最大 所以密码就是7。
    兔子立马解开了密室的门,发现门外还是一个门,而且数字越来越大,兔子没有办法了,所以来求助你。
    提示:异或指在二进制下一位位比较,相同则 0 不同则 1
    例如2=(010)22=(010)_22=(010)2​ 5=(101)25=(101)_25=(101)2​
    所以2 xor 5=(111)2=75=(111)_2=75=(111)2​=7

    输入描述:

    第一行一个数 T,表示数据组数。
    接下来 T 行,每行两个数 L,R, 表示区间[L,R]。

    输出描述:

    输出共T行每行一个整数,表示[L,R]的密码。

    示例1

    输入

    5
    1 10
    2 3
    3 4
    5 5
    2 5

    输出

    15
    1
    7
    0
    7

    备注:

    对于30%的数据 
    1  ≤ T ≤ 10 
    0 ≤ L ≤ R ≤ 100
    对于另外10%的数据 
    L=R
    对于70%的数据 
    1 ≤ T ≤ 10 
    0 ≤ L ≤ R ≤ 50000
    对于100%的数据 
    1 ≤ T ≤ 10000 
    0 ≤ L ≤ R ≤ 1018
    (对于100%的数据) 输入数据较大,请使用快速读入。

    做法

    这题也是挺巧妙的,完全没想到,只能说学习学习吧。

    从第一位开始对比 l 和 r 的二进制数,直到遇到不同的位,构造两个二进制数,一个前几位相同的加上0剩下的全是1,另一个前几位相同的加上1剩下全是0。构造的两个二进制数都在 l 和 r 的范围内,且异或值最大

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int t;
    4. long long l,r;
    5. long long ksm(int a,int b) {//快速幂
    6. long long tmp=a,ans=1;
    7. while(b){
    8. if( (b & 1) == 1) ans*=tmp;
    9. tmp*=tmp;
    10. b>>=1;
    11. }
    12. return ans;
    13. }
    14. long long read(){//快读
    15. long long x=0;
    16. int f=1;
    17. char ch=getchar();
    18. while(ch<'0'||ch>'9'){
    19. if(ch=='-') f=-1;
    20. ch=getchar();
    21. }
    22. while(ch>='0'&&ch<='9'){
    23. x=x*10+ch-'0';
    24. ch=getchar();
    25. }
    26. return x*f;
    27. }
    28. int main(){
    29. scanf("%d",&t);
    30. while(t--){
    31. l=read();
    32. r=read();
    33. if(l==r){
    34. cout<<0<<endl;
    35. continue;
    36. }
    37. string a,b;
    38. while(r){
    39. b+=r%2+'0';
    40. r/=2;
    41. a+='0';
    42. }
    43. int cnt=0;
    44. while(l){
    45. a[cnt++]=l%2+'0';
    46. l/=2;
    47. }
    48. int idex;
    49. for(int i=a.size()-1;i>=0;i--){
    50. if(a[i]!=b[i]) {
    51. idex=i;
    52. break;
    53. }
    54. }
    55. for(int i=idex-1;i>=0;i--){
    56. a[i]='1';
    57. b[i]='0';
    58. }
    59. long long ans=0;
    60. for(int i=0;i<a.size();i++){
    61. if(a[i]!=b[i]) ans+=ksm(2,i);
    62. }
    63. cout<<ans<<endl;
    64. }
    65. }

    wa的原因:

    没用快速幂

  • 相关阅读:
    人工智能的兴起和发展
    SpringEvent的介绍以及实例
    huggingface 模型推理几个重要到类
    MIPI接口介绍
    Postman接口测试之get请求
    HALCON reference_hdevelop翻译Chapter1 1D Measuring(一)
    深度学习常用脚本总结
    yolox
    Bootstrap前端开发框架(简介、版本、优点、使用、布局容器、栅格系统(栅格选项参数,列嵌套,列偏移,列排序,响应式工具))
    使用JPofiler工具分析OOM原因
  • 原文地址:https://blog.csdn.net/2301_80718054/article/details/138920463