• 蓝桥杯练习题


    抓娃娃

    思路:记线段的中点mid=(l+r)/2。注意到当L<=mid<=R时(即2L<=(l+r)<=2R),则区间[L,R]框住了线段,那么我们可以使用前缀和来解决。输入线段l r时,我们让a[l+r]++。计算前缀和后,当查询时我们查询区间[2L,2R]有多少条线段即可。

    1. #include
    2. #define int long long
    3. const int N=2e6+10;
    4. using namespace std;
    5. int n,m;
    6. int a[N];
    7. signed main()
    8. {
    9. cin>>n>>m;
    10. for(int i=1;i<=n;i++)
    11. {
    12. int l,r;cin>>l>>r;
    13. a[l+r]++;
    14. }
    15. for(int i=1;i<=2e6;i++) a[i]=a[i]+a[i-1];
    16. for(int i=1;i<=m;i++)
    17. {
    18. int l,r;cin>>l>>r;
    19. cout<2*r]-a[2*l-1]<<'\n';
    20. }
    21. return 0;
    22. }

    跑步计划

    1. #include
    2. #define int long long
    3. const int N=2e6+10;
    4. using namespace std;
    5. int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    6. bool check(int y,int d,int now)
    7. {
    8. bool f=0;
    9. while(y)
    10. {
    11. int x=y%10;
    12. y/=10;
    13. if(x==1) f=1;
    14. }
    15. while(d)
    16. {
    17. int x=d%10;
    18. d/=10;
    19. if(x==1) f=1;
    20. }
    21. if(now%7==0) f=1;
    22. return f;
    23. }
    24. signed main()
    25. {
    26. int now=6;
    27. int ans=0;
    28. for(int i=1;i<=12;i++)
    29. for(int j=1;j<=d[i];j++)
    30. {
    31. if(check(i,j,now)) ans+=5;
    32. else ans+=1;
    33. now=(now+1)%7;
    34. }
    35. cout<'\n';
    36. }

    01游戏

    1. #include
    2. const int N=15;
    3. using namespace std;
    4. int n;
    5. char g[N][N];
    6. int cstate[N];//保存每列的状态
    7. int visr[1<<15],visc[1<<15];//行、列状态出现的次数
    8. bool check(int x,int y)//检查行列连续3个字符
    9. {
    10. int num=1;
    11. for(int i=1;x-i>=0&&g[x][y]==g[x-i][y];i++)
    12. {
    13. num++;
    14. if(num>2) return 0;
    15. }
    16. num=1;
    17. for(int i=1;y-i>=0&&g[x][y]==g[x][y-i];i++)
    18. {
    19. num++;
    20. if(num>2) return 0;
    21. }
    22. return 1;
    23. }
    24. bool check_row(int x)//检查行01个数
    25. {
    26. int num=0;
    27. for(int j=0;j
    28. if(g[x][j]=='1') num++;
    29. return num==n/2;
    30. }
    31. bool check_col(int y)//检查列01个数
    32. {
    33. int num=0;
    34. for(int i=0;i
    35. if(g[i][y]=='1') num++;
    36. return num==n/2;
    37. }
    38. void dfs(int x,int y,int rstate)
    39. {
    40. if(x==n)//填完了
    41. {
    42. bool ok=1;
    43. for(int j=0;j
    44. {
    45. visc[cstate[j]]++;
    46. if(visc[cstate[j]]>=2) ok=0;
    47. }
    48. for(int j=0;j
    49. visc[cstate[j]]=0;
    50. if(!ok) return ;
    51. for(int j=0;j
    52. if(!check_col(j)) return ;
    53. for(int i=0;i
    54. {
    55. for(int j=0;j
    56. cout<
    57. cout<<'\n';
    58. }
    59. exit(0);
    60. }
    61. else
    62. {
    63. if(g[x][y]=='_')
    64. {
    65. int old=cstate[y];//保存原状态
    66. g[x][y]='1';
    67. cstate[y]|=(1<//记录列的状态
    68. if(check(x,y))
    69. {
    70. if(y+1
    71. {
    72. dfs(x,y+1,rstate|(1<
    73. }
    74. else
    75. {
    76. int newr=rstate|(1<
    77. if(!visr[newr]&&check_row(x))
    78. {
    79. visr[newr]++;
    80. dfs(x+1,0,0);
    81. visr[newr]--;
    82. }
    83. }
    84. }
    85. cstate[y]=old;//恢复列的状态
    86. g[x][y]='_';
    87. g[x][y]='0';
    88. cstate[y]|=(0<//
    89. if(check(x,y))
    90. {
    91. if(y+1
    92. {
    93. dfs(x,y+1,rstate|(0<
    94. }
    95. else
    96. {
    97. int newr=rstate|(0<
    98. if(!visr[newr]&&check_row(x))
    99. {
    100. visr[newr]++;
    101. dfs(x+1,0,0);
    102. visr[newr]--;
    103. }
    104. }
    105. }
    106. cstate[y]=old;
    107. g[x][y]='_';
    108. }
    109. else
    110. {
    111. int old=cstate[y];
    112. int num=g[x][y]-'0';
    113. cstate[y]|=(num<
    114. if(check(x,y))
    115. {
    116. if(y+1
    117. {
    118. dfs(x,y+1,rstate|(num<
    119. }
    120. else
    121. {
    122. int newr=rstate|(num<
    123. if(!visr[newr]&&check_row(x))
    124. {
    125. visr[newr]++;
    126. dfs(x+1,0,0);
    127. visr[newr]--;
    128. }
    129. }
    130. }
    131. // cstate[y]=old;
    132. }
    133. }
    134. }
    135. signed main()
    136. {
    137. cin>>n;
    138. for(int i=0;i
    139. for(int j=0;j
    140. cin>>g[i][j];
    141. dfs(0,0,0);
    142. return 0;
    143. }

     钉板上的正方形

    思路:枚举四个顶点是不好判断的。我们可以枚举左上的点和左下的点,然后根据正方形的性质去找到另外两个点,再判断这两个是否存在即可。注意:不用开根号避免精度问题。

    1. #include
    2. const int N=15;
    3. using namespace std;
    4. int g[10][10]={
    5. 1,1,0,1,0,1,1,1,1,1,
    6. 1,1,1,0,0,1,1,1,1,0,
    7. 1,1,0,0,1,0,1,1,1,1,
    8. 1,0,1,1,0,1,1,1,1,0,
    9. 1,0,1,0,1,1,1,1,0,0,
    10. 1,0,0,1,0,1,0,1,0,1,
    11. 1,1,1,1,1,1,1,1,1,0,
    12. 0,1,1,1,1,1,1,1,1,0,
    13. 0,1,1,0,1,0,1,1,1,1,
    14. 1,0,1,0,0,1,0,1,0,0
    15. };
    16. signed main()
    17. {
    18. set<int>s;
    19. for(int i=0;i<10;i++)
    20. for(int j=0;j<10;j++)
    21. if(g[i][j])
    22. {
    23. for(int k=i+1;k<10;k++)
    24. for(int p=0;p<=j;p++)
    25. if(g[k][p])
    26. {
    27. if(i+j-p<10&&j+k-i<10&&k+j-p<10&&p+k-i<10&&g[i+j-p][j+k-i]&&g[k+j-p][p+k-i])
    28. {
    29. s.insert((k-i)*(k-i)+(j-p)*(j-p));
    30. }
    31. }
    32. }
    33. cout<size()<<'\n';
    34. return 0;
    35. }

  • 相关阅读:
    JavaEE-http/https/Tomcat(上)
    RK3399平台开发系列讲解(ALSA子系统)4.37、ALSA驱动框架
    Java培训:现实世界中的原生Java
    ADAU1860调试心得(8)FASTDSP-0 通道输入
    SpringBoot集成RocketMQ实现分布式事务
    Charles简单压力测试
    qml GroupBox用法介绍
    完全二叉树问题
    Linux 权限
    用C语言实现牛顿摆控制台动画
  • 原文地址:https://blog.csdn.net/qq_62615329/article/details/139246419