试题 历届真题 生物芯片【第五届】【决赛】【B组】

X博士正在研究一种生物芯片,其逻辑密集度、容量都远远高于普通的半导体芯片。

  博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮。

  这些光源的编号从 1 到 n,开始的时候所有光源都是关闭的。

  博士计划在芯片上执行如下动作:

  所有编号为2的倍数的光源操作一次,也就是把 2 4 6 8 ... 等序号光源打开

  所有编号为3的倍数的光源操作一次, 也就是对 3 6 9 ... 等序号光源操作,注意此时6号光源又关闭了。

  所有编号为4的倍数的光源操作一次。

  .....

  直到编号为 n 的倍数的光源操作一次。


  X博士想知道:经过这些操作后,某个区间中的哪些光源是点亮的。

输入格式

  3个用空格分开的整数:N L R (L<R<N<10^15) N表示光源数,L表示区间的左边界,R表示区间的右边界。

输出格式

  输出1个整数,表示经过所有操作后,[L,R] 区间中有多少个光源是点亮的。

  例如:

输入格式

  5 2 3
  程序应该输出:
  2

  再例如:

输入格式

  10 3 6
  程序应该输出:
  3

题解

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    long long int n,l,r,sum;
    cin>>n>>l>>r;
    sum=r-l+1;
    long long int ll=(int)(sqrt(l-1));
    long long int rr=(int)(sqrt(r));
    cout<<sum+ll-rr;
    return 0;
}

一道数学题,运用了完全平方数的因数个数是奇数这个规律

具体做法学习了这篇博客,分析得很清楚

第五届蓝桥杯决赛B组C/C++——生物芯片 - 云+社区 - 腾讯云

洛谷上有一道该规律的基本运用题:

P1876 开灯

题目背景

该题的题目是不是感到很眼熟呢?

事实上,如果你懂的方法,该题的代码简直不能再短。

但是如果你不懂得呢?那。。。(自己去想)

题目描述

首先所有的灯都是关的(注意是关!),编号为 11 的人走过来,把是 11 的倍数的灯全部打开,编号为 22 的人把是 22 的倍数的灯全部关上,编号为 33 的人又把是 33 的倍数的灯开的关上,关的开起来……直到第 NN 个人为止。

给定 NN,求 NN 轮之后,还有哪几盏是开着的。

输入格式

一个数 NN,表示灯的个数和操作的轮数。

输出格式

若干数,表示开着的电灯编号。

输入输出样例

输入 #1复制

5

输出 #1复制

1 4

说明/提示

【数据范围】

对于 100 \%100% 的数据,1 \le N \le 2^{40}1≤N≤240。

【其他说明】

数学题!

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
double blood =10,t;
int n,x,sum;
int main(){
  cin>>n;
  cout<<1;
  for(int i=2;i<=sqrt(n);i++)
  {
  	cout<<" "<<i*i;
  }
  return 0;
}

### 回答1: 好的,这是一道关于双向排序的省赛试题。题目描述如下: 给定一个长度为 $n$ 的正整数序列 $a_1,a_2,\cdots,a_n$,将它们分为两,设第一的元素为 $b_1,b_2,\cdots,b_m$,第二的元素为 $c_1,c_2,\cdots,c_{n-m}$,满足: - $b_1,b_2,\cdots,b_m$ 按照从大到小的顺序排列。 - $c_1,c_2,\cdots,c_{n-m}$ 按照从小到大的顺序排列。 - 对于所有 $1\le i<j\le m$,有 $b_i+b_j>a_k$,其中 $1\le k\le n-m$。 - 对于所有 $1\le i<j\le n-m$,有 $c_i+c_j<b_k$,其中 $1\le k\le m$。 现在给定 $n$ 和 $a_1,a_2,\cdots,a_n$,求符合条件的分方案数。 例如,当 $n=4$,$a_1=2,a_2=4,a_3=1,a_4=3$ 时,符合条件的分方案有 $3$ 种,分别为: - $b_1=4,b_2=2$,$c_1=1,c_2=3$; - $b_1=4,b_2=3$,$c_1=1,c_2=2$; - $b_1=3,b_2=2$,$c_1=1,c_2=4$。 请问这道题应该如何解答呢? ### 回答2: 第十二届省赛B的双向排序问题是一个典型的排序问题。 双向排序是指按照特定的规则对数据进行排序,既可以按照从小到大,也可以按照从大到小的顺序进行排列。这个问题可以使用排序算法来解决。 解决该问题的一种方法是使用冒泡排序算法。该算法的思想是通过多次遍历数,比较相邻的元素并交换位置,使得最大(或最小)的元素逐渐移到末尾(或开头),以此实现排序。 具体步骤如下: 1. 定义一个布尔变量flag来表示是否发生了元素交换的操作,默认为false。 2. 从数的第一个元素开始,依次比较相邻元素,如果前一个元素大于(或小于)后一个元素,则交换它们的位置,并将flag设为true,表示发生了交换。 3. 遍历完一次数后,如果flag仍为false,说明数已经是有序的,可以结束排序。 4. 如果flag为true,继续进行下一次遍历,从头开始重复上述步骤。 5. 重复步骤2-4,直到数完全排序。 在双向排序的问题中,需要使用两个冒泡排序。首先,按照从小到大的顺序对每一行进行排序,然后按照从大到小的顺序对每一列进行排序。这样一来,就可以实现双向排序。 总结起来,双向排序问题可以使用冒泡排序算法来解决。通过多次遍历数,分别按照行和列进行排序,即可达到双向排序的目的。 ### 回答3: 第十二届省赛B试题是关于双向排序的。双向排序是一种特殊的排序方法,既可以按照某一列的数值大小进行排序,又可以按照某一行的数值大小进行排序。 假设给定一个m行n列的矩阵,我们需要设计一个算法,使得矩阵按照以下规则进行排序: 1. 首先按照每一行的最小值进行排序,即每一行元素中最小的数排在前面; 2. 如果有两行及以上的最小值相同,则按照其所在行数从小到大进行排序; 3. 对于行数相同的元素,按照其所在列数从小到大进行排序。 我们可以采用以下步骤实现双向排序: 1. 遍历每一行,找到每一行的最小值,并将其与第一列的元素交换位置,保证每一行的最小值都在第一列; 2. 对矩阵按照第一列的数值大小进行排序,即将每一行的第一个元素作为关键字进行排序; 3. 对于第一列相同的元素,按照其所在行数从小到大进行排序,可以使用快速排序等算法实现; 4. 对于行数相同的元素,按照其所在列数从小到大进行排序,可以使用冒泡排序等算法实现。 通过以上步骤,我们可以得到按照双向排序规则排列的矩阵。这种排序方法可以保证每一行的最小值都在前面,同时满足其他排序规则。双向排序不仅简洁高效,还可以直观地展示矩阵中元素的分布情况,方便后续的数据分析和处理。 总结起来,双向排序是一种特殊的排序方法,可以按照每一行的最小值先排序,再按照行数和列数进行排序。它可以通过简单的交换和排序算法来实现,对于需要按照行和列进行排序的矩阵数据,是一种非常有用的排序方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值