zoukankan      html  css  js  c++  java
  • 1.6期末模拟题题解

    1.9更新

    1. 二分法代码写了一下,也是有坑的 ;P
    2. 贴几个选择题相关的链接,和老师发的期末范围

    期末考试题型与分值分布:

    python语言,4个选择,2个编程 python基础语法
    算法,2个选择,2个编程
    网络,5个选择 http相关
    数据思维,5个选择,2个编程(编程都是numpy) numpy基础用法
    人工智能慕课,4个选择 人工智能相关


    本篇题解每一份代码都有坑,请慎重复制

    1. 上台阶

    小明要上一个n级台阶,他每次可以上1级或者直接上2级,请问小明一共有几种不同的方法上台阶?
    例如,对于一个3级的台阶,小明有3种不同的方法上去:1)每次上1级。2)先上1级,再直接上2级。3)先直接上2级,再上1级。

    • 题解
      思考对于第i阶台阶,可从第i-1阶和第i-2阶走过来,走到第0/1阶都只有1种方式,可写出递归方程

    [f(i)=f(i-1)+f(i-2),f(0)=1,f(1)=1 ]

    递归程序:时间复杂度(O(2^n))

    def f(n):
          if n==1:
                return 1
          return f(n-1)+f(n-2)
    n=int(input())
    print(f(n))
    

    观察到(f(i-2))还可被(f((i-1)-1))重复调用,可转化为记忆化搜索(python写不了,下面是c++),将(f(i))的值在第一次访问后记录下来,节省时间/空间。时间复杂度(O(n))(常数较大)

    #include<cstdio>
    #include<cstring>
    int f[10000]
    int func(n)
    {
          return f[n]? f[n]:fn[n]=func(n-1)+func(n-2);
    }
    int main()
    {
          int n;
          scanf("%d",&n);
          printf("%d",func(n));
          return 0;
    }
    

    记录后观察数组数据/转移方程,可以看出是fib,利用单层循环可解决。时间复杂度(O(n))

    f=[0]*1000
    n=int(input())
    f[0]=1
    f[1]=1
    for i in range(2,n):
          f[i]=f[i-1]+f[i-2]
    print(f[n])
    

    此处还可利用线性代数优化时间复杂度到(O(logn))

    2. 黄金分割

    黄金分割是指将整体一分为二,较大部分与整体部分的比值等于较小部分与较大部分的比值,其比值约为0.618。这个比例被公认为是最能引起美感的比例,因此被称为黄金分割。
    要求:从键盘输入一个整数n作为整体,将n分解为两个整数n1和n2(假设n1<=n2),使得n1+n2=n,模拟黄金分割,找到n1与n2比值和n2与n比值最接近的那组数据,并且将该比值以及n1、n2的值存入列表并输出。
    例如,n=5,可以分解为[1,4]和[2,3]两组,满足上述要求的是[2, 3],将[0.6666666666666666, 2, 3]存入列表并输出。

    • 题解
      暴力枚举每一组拆分情况,找到最接近的解,时间复杂度(O(n))
    n = int(input(''))
    cek=0.618
    E=1e-6
    _min=10000000
    ans=[]
    for i in range(1,n):
        if (abs((n-i)/i-cek)<_min):
            ans=[(n-i)/i,i,n-i]
            _min=abs((n-i)/i-cek)
    print(ans)
    

    3. 卖鸭子

    一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了n个村子后还剩m只鸭子,问他出发时共赶多少只鸭子?(n和m是输入的已知值)

    • 题解
      反向看问题,每走过一个村庄得到一只鸭子再翻倍,时间复杂度(O(n))
    n = eval(input())
    m = eval(input())
    while(n!=0):
        m=(m+1)*2
    print(m)
    

    也可根据二进制特性(O(1))解决

    4. 二分法求方程的根

    请使用二分法求方程

    [f(x)=-sin(x)e^x+15 imes cos(x) imes sqrt x ]

    在范围内[2,5]之间的根root, 要求f(root)的值与0值的误差小于等于1e-8。已知f(2)<0, f(5)>0。要求所求根保留8位小数输出

    • 题解
      由于已知(f(2)<0, f(5)>0)二分答案判断中点值处函数值大小,根据正负选择下一步二分区间
    import math
    def f(x):
        return -math.sin(x)*math.e**x+15*math.cos(x)*x**0.5
    E=1e-8
    l=2
    r=5
    mid=(l+r)/2
    while(abs(f(mid))>E):
        if( f(mid)>0):
            l=mid
        else:
            r=mid
        mid=(l+r)/2
    print(mid)
    

    5.足球比赛

    有三只球队,每只球队编号分别为球队1,球队2,球队3,这三只球队一共需要进行 n 场比赛。现在已经踢完了k场比赛,每场比赛不能打平,踢赢一场比赛得一分,输了不得分不减分。已知球队1和球队2的比分相差d1分,球队2和球队3的比分相差d2分,每场比赛可以任意选择两只队伍进行。求如果打完最后的 (n-k) 场比赛,有没有可能三只球队的分数打平。


    输入描述:
    第一行包含一个数字 t (1 <= t <= 10)
    接下来的t行每行包括四个数字 n, k, d1, d2(1 <= n <= 10^12; 0 <= k <= n, 0 <= d1, d2 <= k)
    输出描述:
    每行的比分数据,最终三只球队若能够打平,则输出“yes”,否则输出“no”

    • 题解
      简单的结论题,但因为是结论题所以不简单........

    在踢完(k)场比赛后,分数可能有以下四种情况

    球队1 球队2 球队3
    1 x-d1 x x-d2
    2 x+d1 x x-d2
    3 x-d1 x x+d2
    4 x+d1 x x+d2

    根据题意,表格中的任意一个数都应该是正整数,且和为(k).则可在上述四种中找出正确的组合.

    1. 若第一种情况成立,打平需要让1队/3队分别获得d1/d2分,再将剩下的分数三等分
    2. 若第二种情况成立,打平需要让2队/3队分别获得d1/d1+d2分,再将剩下的分数三等分
    3. 若第三种情况成立,打平需要让1队/2队分别获得d1+d2/d2分,再将剩下的分数三等分
    4. 若第四种情况成立,打平需要让[1/3中较小的一队]/2队分别获得(max{d1,d2}-min{d1,d2})/(max{d1,d2})分,再将剩下的分数三等分

    若符合以上四种情况中的任意一种则可输出'yes',否则输出'no'

    t = int(input())
    for i in range(t):
        [n, k, d1, d2] = [int(x) for x in input().split(' ')]
        r = n - k        
        if d1>d2:
            x = 2*d1-d2
            y = d1
        else:
            x = 2*d2-d1
            y = d2
        if (r-(2*d1+d2))>=0 and (r-(2*d1+d2))%3==0 and (n-3*(d1+d2))>=0 and (n-3*(d1+d2))%3==0:
            print('yes')
        elif (r-x)>=0 and (r-x)%3==0 and (n-3*y)>=0 and (n-3*y)%3==0:
            print('yes')
        elif (r-(d1+d2))>=0 and (r-(d1+d2))%3==0 and (n-3*y)>=0 and (n-3*y)%3==0:
            print('yes')
        elif (r-(d1+2*d2))>=0 and (r-(d1+2*d2))%3==0 and (n-3*(d1+d2))>=0 or (n-3*(d1+d2))%3==0:
            print('yes')
        else:
            print('no')
    

    6.数组基本操作

    创建初始值为1,终值为12,元素个数为12的等差数组,使其元素为整数,改变数组形状为3行4列的二维数组,将数组中值小于3或大于9的元素值设为0,最后选取数组的第一列和最后一列输出。

    import numpy as np
    l=np.arange(1,13,1,int) #创建初始值为1,终值为12,元素个数为12的等差数组,使其元素为整数
    x=l.reshape(3,4)        #改变数组形状为3行4列的二维数组
    x[x<3]=0
    x[x>9]=0                 #将数组中值小于3或大于9的元素值设为0
    print(x[:,1],x[:,-1])    #最后选取数组的第一列和最后一列输出
    

    7.九九乘法表

    for i in range(1,10):
        for j in range(1,i+1):
            print('{0}*{1}={2}'.format(i,j,i*j),end=' ')
        print()
    

    (不知道为什么过不了,明明和图片一样)

    8.二分法进行数字查找

    请使用二分法在一个升序列表中查找两个数,使得两者的立方和等于给定的数X。
    如果找到了,请输出这两个数,并用空格分隔;如果没有找到,请输出-1

    • 题解
      循环找第一个数,二分找第二个
    def find(A,left):
          l=0,r=A.len()
          while( l < r):
                mid=(l+r)//2
                if(left == A[mid]**3):return mid
                if (left<A[mid**3]):
                      r=mid
                else:
                      l=mid
          return -1
    
    
    for i in A:
          ans=find(A,x-i**3)
          if(ans != -1):
                print(i,A[ans])
                break
    if(ans==-1):
          print('-1')
    

    9.公式计算并打印

    编写一个程序,根据给定的公式计算并打印值:

    [Q=sqrt{ {2 imes C imes D}/ {H} } ]

    以下是C和H的固定值:C是50。H是30。
    D是一个变量,它的值应该以逗号分隔的序列输入到程序中。

    import math
    c = 50
    h=30
    t=[]
    t = map(int,input().split(','))
    for d in t:
        print(math.sqrt(2*c*d/h))
    

    这题不知道输出格式...似乎也过不了

    10.数组基本操作

    a是一个n行m列的二维数组,求出数组周边元素之和。

    print(l.sum(axis=1)[0]+l.sum(axis=1)[n-1]+l.sum(axis=0)[0]+l.sum(axis=0)[m-1]-l[0][0]-l[0][m-1]-l[n-1][0]-l[n-1][m-1])
    

    11数组基本操作

    代码中score表示n个学生3门功课的成绩表,数据已经生成
    要求:
    1. 求出每门课程的最高分以及对应的行索引,输出最高分及行索引(从第1行开始计数)。
    2. 求出每个学生的平均成绩并输出。

    print(np.amax(score,axis=1))
    print(np.argmax(score,axis=1))
    print(np.mean(score,axis=1))
    
  • 相关阅读:
    CriminalIntent项目开发笔记(二)
    CriminalIntent项目开发笔记(一)----动态添加Fragment
    android应用中去掉标题栏的方法
    15个IT程序员必须思考的问题
    Android Studio快捷键
    Android 学习笔记
    win7系统安装方法
    jquery随学随记
    接口功能测试策略--转载
    测试随笔
  • 原文地址:https://www.cnblogs.com/shulker/p/14246219.html
Copyright © 2011-2022 走看看