首页 > 编程语言 >2022 CSP-J 阅读程序3

2022 CSP-J 阅读程序3

时间:2024-09-12 13:51:11浏览次数:1  
标签:solve1 16 int 复杂度 阅读程序 1.732 2022 CSP 输入

1 2022 CSP-J 阅读程序3

阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填×;除特 殊说明外,判断题 1.5 分,选择题 3 分)

源代码

#include<iostream>
 
using namespace std;

int n,k;

int solve1()
{
    int l=0,r=n;
    while(l<=r){
        int mid=(l+r)/2;
        if(mid * mid <=n) l=mid+1;
        else r=mid-1;
    }
    return l-1;
}

double solve2(double  x)
{
    if(x == 0) return x;
    for(int i=0;i<k;i++)
        x=(x+n/x)/2;
    return x;
}

int main()
{
    cin>>n>>k;
    double ans=solve2(solve1());
    cout<<ans<<' '<<(ans * ans == n)<<endl;
    return 0;
}

假设int为32位有符号整数类型,输入的n是不超过47000的自然数、k是不超过int表示范围的自然数,完成下面的判断题和单选题

判断题

28.该算法最准确的时间复杂度分析结果为O(logn+k) ( )

29.当输入为"9801 1"时,输出的第一个数为"99" 。( )

30.对于任意输入的n,随着所输入k的增大,输出的第2个数会变成"1" 。( )

31.该程序有存在缺陷。当输入的n过大时,第12行的乘法有可能溢出,因此应当将mid强制转换为64位整数再计算。( )

单选题

32.当输入为 “2 1” 时,输出的第一个数最接近( )

A. 1

B. 1.414

C. 1.5

D. 2

33.当输入"3 10"时,输出的第一个数最接近( )

A. 1.7

B. 1.732

C. 1.75

D. 2

34.当输入为"256 11"时,输出的第一个数( )

A. 等于16

B. 接近但小于16

C. 接近但大于16

D. 前三种情况都有可能

2 相关知识点

1) 算法时间复杂度

算法时间复杂度定性描述该算法的运行时间,常用大O符号表述

常用时间复杂度举例

2) 二分答案

二分答案顾名思义,它用二分的方法枚举答案,并且枚举时判断这个答案是否可行

直接对答案进行枚举查找,接着判断答案是否合法。如果合法,就将答案二分进一步靠近,如果不合法,就接着二分缩小判断。这样就可以大大的减少时间。

二分中有时可以得可行得答案,但不是最大的,继续向右靠近,求出最大值

示例

 int ans = 1;
 int l = 1,r = 100000;//在1~100000之间的整数枚举 
 while(l <= r){
     int m = l + (r - l) / 2;
     if(check(m)){//满足 则进行向右缩小范围 看看有没有更大的 
         ans = m;//可能多次赋值 最后一定是可能的最大值 
         l = m + 1;
      }else{//不满足缩小边长 向左缩小范围 用更小边长继续尝试 
         r = m - 1;
	  } 
  }

二分查找时间复杂度分析

二分查找每次都缩小或扩大为原来的一半和上面示例4类似,所以也是Olog(n)

3 思路分析

solve1函数

int solve1()
{
    int l=0,r=n;
    while(l<=r){
        int mid=(l+r)/2;
        if(mid * mid <=n) l=mid+1;
        else r=mid-1;
    }
    return l-1;
}

solve1函数是一个标准的二分答案算法,找到1个数x ,使得x * x 无限接近于n

也就是求n的平方根,当n=4时进行验证

n=4  l=0 r=4
//0<=4 进入循环
//第1次循环
mid=(l+r)/2=(0+4)/2=2 ,mid * mid =2 * 2=4<=4 条件满足 l=mid+1=2+1=3 r=4
//3<=4 条件满足
//第2次循环
mid=(l+r)/2=(3+4)/2=3, mid * mid =3 * 3 =9<=4 不满足,r=mid-1=3-1=2 l=3
//3<=2 条件不满足 退出循环
//返回 l-1 = 3 -1 =2
//所以当n=4时,函数solve1返回2,是4得平方根

如果n=5,是否也可以算出其平方根呢?

n=5  l=0 r=5
//0<=5 进入循环
//第1次循环
mid=(l+r)/2=(0+5)/2=2 ,mid * mid =2 * 2=4<=5 条件满足 l=mid+1=2+1=3 r=5
//3<=5 条件满足
//第2次循环
mid=(l+r)/2=(3+5)/2=4, mid * mid =4 * 4 =16<=5 不满足,r=mid-1=4-1=3 l=3
//3<=3 条件满足
//第3次循环
mid=(l+r)/2=(3+3)/2=3, mid * mid =3 * 3 =9<=5 不满足,r=mid-1=3-1=2 l=3
//3<=2 条件不满足 退出循环
//返回 l-1 = 3 -1 =2
//所以当n=5时,函数solve1返回2,不是5得平方根,2是小于5平方根得最大整数

根据如下代码,可以大概猜测solve2是辅助求出平方根是小数的情况,如果猜不出,可以模拟对应数据

double ans=solve2(solve1());
cout<<ans<<' '<<(ans * ans == n)<<endl;

假设int为32位有符号整数类型,输入的n是不超过47000的自然数、k是不超过int表示范围的自然数,完成下面的判断题和单选题

判断题

28.该算法最准确的时间复杂度分析结果为O(logn+k) ( T )

分析

此题调用了2次函数,solve1和solve2,其中solve1是二分答案,时间复杂度为O(logn),solve2的时间复杂度为O(k)

所以准确的时间复杂度为2者之和O(logn+k)

29.当输入为"9801 1"时,输出的第一个数为"99" 。( T )

分析

n=9801 ,求其对应平方根是99

k为1,执行1次 x = (x + n / x) / 2;

x=(99 + 9801/99)/2=99

所以是99

30.对于任意输入的n,随着所输入k的增大,输出的第2个数会变成"1" 。( F )

分析

如果平方根不是整数,求出结果没有精确的值,只能计算n的近似值,所以不会相等,返回false为0

31.该程序有存在缺陷。当输入的n过大时,第12行的乘法有可能溢出,因此应当将mid强制转换为64位整数再计算。( F )

分析

n最大是47000,中间可能导致溢出的是mid * mid,最大是(47000/2)*(47000/2)不会超过int的表示范围21亿

单选题

32.当输入为 “2 1” 时,输出的第一个数最接近( C )

A. 1

B. 1.414

C. 1.5

D. 2

分析

当n=2时,solve1求出平方根整数为1

//模拟过程
n=2  l=0 r=2
//0<=2 进入循环
//第1次循环
mid=(l+r)/2=(0+2)/2=1 ,mid * mid =1 * 1=1<=2 条件满足 l=mid+1=1+1=2 r=2
//2<=2 条件满足
//第2次循环
mid=(l+r)/2=(2+2)/2=2, mid * mid =2 * 2 =4<=2 不满足,r=mid-1=2-1=1 l=2
//2<=1 条件不满足 退出循环
//返回 l-1 = 2 -1 =1

k为1,执行1次 x = (x + n / x) / 2;

x=(1+2/1)/2=1.5

所以选C

33.当输入"3 10"时,输出的第一个数最接近( B )

A. 1.7

B. 1.732

C. 1.75

D. 2

分析

当n=3时,solve1求出平方根整数为1

//模拟过程
n=3  l=0 r=3
//0<=3 进入循环
//第1次循环
mid=(l+r)/2=(0+3)/2=1 ,mid * mid =1 * 1=1<=3 条件满足 l=mid+1=1+1=2 r=3
//2<=3 条件满足
//第2次循环
mid=(l+r)/2=(2+3)/2=2, mid * mid =2 * 2 =4<=3 不满足,r=mid-1=2-1=1 l=2
//2<=1 条件不满足 退出循环
//返回 l-1 = 2 -1 =1

k为10,执行10次 x = (x + n / x) / 2;

第1次 x=(1+3/1)/2=2
第2次 x=(2+3/2)/2=1.75
第3次 x=(1.75+3/1.75)/2=1.732
第4次 x=(1.732+3/1.732)/2=1.732
3/1.732 =1.732 所以后续计算约等于1.732

所以选B

34.当输入为"256 11"时,输出的第一个数( A )

A. 等于16

B. 接近但小于16

C. 接近但大于16

D. 前三种情况都有可能

分析

当n=256时,solve1求出平方根整数为16

//模拟过程
n=256  l=0 r=256
//0<=256 进入循环
//第1次循环
mid=(l+r)/2=(0+256)/2=128 ,mid * mid =128 * 128<=256 条件不满足 r=mid-1=128-1=127 l=0
//0<=127 条件满足
//第2次循环
mid=(l+r)/2=(0+127)/2=63, mid * mid =63 * 63 <=256 条件不满足,r=mid-1=63-1=62 l=0
//0<=62 条件满足
//第3次循环
mid=(l+r)/2=(0+62)/2=31, mid * mid =31 * 31 <=256 条件不满足,r=mid-1=31-1=30 l=0 
//0<=30 条件满足
//第4次循环
mid=(l+r)/2=(0+30)/2=15, mid * mid =15 * 15 =225 <=256 条件满足,l=mid+1=15+1=16 r=30    
//16<=30 条件满足
//第5次循环
mid=(l+r)/2=(16+30)/2=24, mid * mid =24 * 24<=256 不满足,r=mid-1=24-1=2 l=16
//16<=23 条件满足
//第6次循环
mid=(l+r)/2=(16+23)/2=19, mid * mid =19 * 19<=256 不满足,r=mid-1=19-1=18 l=16
//16<=18条件满足
//第7次循环
mid=(l+r)/2=(16+18)/2=17, mid * mid =17 * 17<=256 不满足,r=mid-1=17-1=16 l=16
//16<=16条件满足
//第8次循环
mid=(l+r)/2=(16+16)/2=16, mid * mid =16 * 16<=256 条件满足,l=mid+1=16+1=17 r=16     
//17<=16 条件不满足 退出循环
//返回 l-1 = 17 -1 =16

k为11,执行11次 x = (x + n / x) / 2;

第1次 x=(16+256/16)/2=16
第2次 x=(16+256/16)/2=16
....
第11次 x=(16+256/16)/2=16

所以选A

标签:solve1,16,int,复杂度,阅读程序,1.732,2022,CSP,输入
From: https://www.cnblogs.com/suishou/p/18410035

相关文章

  • CSP-CCF★★201703-2学生排队★★
    目录 一、问题描述二、解答方法1:使用数组方法2:使用vector容器三、总结 一、问题描述问题描述体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或......
  • CSP-CCF★★201803-2碰撞的小球★★
    目录一、问题描述二、解答三、总结一、问题描述问题描述数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。当小球到达线段的端点(左端点或......
  • CSP-CCF ★★201709-2公共钥匙盒★★
    一、问题描述问题描述有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教......
  • CSP-S 2023
    T1直接\(10^{5}\)枚举状态就过了,合法的非零差分数量只可能为\(1,2\)(\(0\)相当于没转,按照题意“都不是正确密码”是不符的)需要注意的是形如09111->10111这样的合法状态#include<bits/stdc++.h>usingnamespacestd;intn;inta[10][9];intp[6];boolche......
  • VS2022 17.12.0 Preview2版本对Copilot的功能增强
    前提条件,使用最新版的17.12.0Preview2,并且有有效的CopilotAI订阅,那么可以体验这些新鲜好用的功能增强了CopilotAI对IEnumerableVisualizer的可编辑表达式功能我们可以通过AI实现一些复杂的条件筛查,并且可以即时验证结果是否符合预期,对于开发和调试提供了极大的便利性......
  • Windows Server 2022 rdp
    继续水一篇:2022废弃了xddm转而使用wddm,rdp的渲染有比较大的变化。高版本的unreal又需要2022支持,被迫走上魔改windows以提升2022rdp环境下抓屏帧数的道路。测试代码来自https://github.com/robmikh/Win32CaptureSample,只手动添加了输出fps逻辑。patchwindows后能在[60,90]......
  • CSP-S 2023 游记
    在CSP-S2024来临之际,补一下CSP-S2023游记CSP-S开题顺序:T1+T2+T4+T3时间分配:T130min,T21h,T42h,T330min场上即兴考试思路:快速切T1,死磕T2(没想到1h就想到了),接着T4试着AC(然后就深陷其中,红温了),T3场上忘了。T1正常发挥,T2其实也挺谁的,想到\(O(n^2)\)做法就一个......
  • NOIP 2018 普及组初赛试题及解析(第三部分:阅读程序写结果(1-4))
    阅读程序一代码:#include<stdio.h>charst[100];intmain(){scanf("%s",st);for(inti=0;st[i];++i){if('A'<=st[i]&&st[i]<='Z')st[i]+=1;}printf("%s\n&quo......
  • NOIP2022 游记
    NOIP2022游记突然想起来两年前的一篇游记没写,现在好像也已经很难再回忆起什么了,但我的OI生涯中也就这两场比赛,总得留下点什么来让日后回味这段充满热血的时光。Background坐标sc弱校,文化课不顶尖,但在年级上还算比较强,停课之前大概能维持在年级前\(25\)的样子。不是那种......
  • CEOI2022
    Day1T1Abracadabra题意:给你一个\(1\simn\)的排列\(p\),保证\(n\)为偶数,我们对它进行足够多次数的洗牌操作,定义一次洗牌为:考虑取出\(p_{1\sim\frac{n}{2}}\)作为序列\(A\),取出\(p_{\frac{n}{2}+1\simn}\)作为序列\(B\),将\(A\)和\(B\)归并后重新放回\(......