CCF CSP认证 历年题目自练Day12

题目一

试题编号: 201609-1
试题名称: 最大波动
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  小明正在利用股票的波动程度来研究股票。小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。
输入格式
  输入的第一行包含了一个整数n,表示小明拿到的收盘价格的连续天数。
  第二行包含n个正整数,依次表示每天的收盘价格。
输出格式
  输出一个整数,表示这只股票这n天中的最大波动值。
样例输入
6
2 5 5 7 3 5
样例输出
4
样例说明
  第四天和第五天之间的波动最大,波动值为|3-7|=4。
评测用例规模与约定
  对于所有评测用例,2 ≤ n ≤ 1000。股票每一天的价格为1到10000之间的整数。

题目分析(自己理解)

  1. 常规输入,这种见太多了,如果各位有看我第一期的一定知道,直接上代码:n=int(input())
    num=list(map(int,input().split()))
  2. 这道题很简单,我只需要两两比较然后把最大值输出即可,关键一点就是绝对值的问题怎么解决,第一种方法是去判断谁大谁小,只用大的减小的,再用max存储,最后输出max即可。
  3. 上代码!!!
n=int(input())
num=list(map(int,input().split()))
max=0
a=0
b=0
for i in range(n-1):
    if num[i+1]>num[i]:
        a=num[i+1]-num[i]
        if a>max:
            max=a
    elif num[i+1]<=num[i]:
        b = num[i]-num[i+1]
        if b> max:
            max = b
print(max)

  1. 还有一种是直接用函数去做绝对值的判断。
  2. abs()函数返回绝对值。
n=int(input())
l=list(map(int,input().split()))
max=0
for i in range(n-1):
    if abs(l[i]-l[i+1])>max:
        max=abs(l[i]-l[i+1])
print(max)

题目二

试题编号: 201609-2
试题名称: 火车购票
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
  假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
  购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
  假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
  输入的第一行包含一个整数n,表示购票指令的数量。
  第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
  输出n行,每行对应一条指令的处理结果。
  对于购票指令p,输出p张车票的编号,按从小到大排序。
样例输入
4
2 5 4 2
样例输出
1 2
6 7 8 9 10
11 12 13 14
3 4
样例说明
  1) 购2张票,得到座位1、2。
  2) 购5张票,得到座位6至10。
  3) 购4张票,得到座位11至14。
  4) 购2张票,得到座位3、4。
评测用例规模与约定
  对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。

题目分析(自己理解)

  1. 常规输入,不啰嗦,
    n=int(input())#有几个人要买票
    peo=map(int,input().split())#每个人要买几张票
  2. 用列表来存储车厢座位,用列表嵌套列表表示每一排还多少空位。
  3. 第一种情况,都有空,找相领的座位,不够直接下一排,第二种,相邻的座位没有了,只好从第一排找空位,找一个空位就填一个。
  4. 怎样实现?第一种情况,关键在于确定位序和车票编号之间的关系,可以用当前排总共有多少座位减去空位加上遍历的序号就可以确定我的车厢座位序号,那么在这个值上加一就是车票编号。(具体见代码注释)
    5.第二种情况,相邻的已经安排完了,还有一个人买多张票的,就从第一排开始遍历,找到一个就安排一个,一直遍历到安排完为止。
  5. 上代码!!!
n=int(input()
peo=map(int,input().split())
car=[]#车厢座位
h=[]#每排剩下的座位数
for i in range(100):#从0到99一共100个座位号
    car+=[0]#用0表示是空的,1表示被安排了,列表嵌套列表
for i in range(20):#共20排,每一排5个空位
    h+=[5]
for i in peo:#遍历每个人要买几张票
    bl = False#没安排完
    for j in range(20):#遍历每一排,从第一排开始找
        if h[j]>=i:#找能坐在一起的座位
            for k in range(i):#对于同一个人买了多张票,一张一张安排
                car[5*j+5-h[j]+k]=5*(j)+5-h[j]+k+1#找到位置并且把值赋值为车票编号
                if k==0:#第一张票的编号在输出样例的最左边,前面没空格
                    print(car[5*j+5-h[j]+k],end='')
                else:#除第一张票前面没空格后面的接空格再输出
                    print('',car[5*j+5-h[j]+k],end='')
            h[j]-=i#空位在减少h[j]要更新,每安排一个人的就减去那个人要买的票数
            bl=True#能领座的就领座,第一种情况安排完了
            break
    if bl==False:#没有坐在一起的座位,空位排着坐
        m=0#确定输出格式
        for j in range(100):#从0号开始找
            if car[j]==0:#找到一个就安排一个
                car[j]=j+1#确定车票编号
                i-=1#安排一个就减去一个
                if m==0:
                    print(car[j],end='')
                else:
                    print('',car[j],end='')
                m+=1
            if i==0:#安排完了
                break#跳出
    print()#换行



总结

MY DREAM
一直地,一直地,往前走。
疯狂的世界。
迎着痛,把眼中所有梦都交给时间。
想飞,就用心地去飞!
谁不经历狼狈?!
我想我会忽略失望的灰,拥抱遗憾的美。
我的梦说别停留等待。
就让光芒折射湿润的瞳孔!
映出心中最想拥有的彩虹!
带我奔向那片有你的天空!
因为你,是我的梦!
执着的,勇敢的,不回头!
穿过了黑夜,踏破了边界。
路过雨,路过风,往前冲!
总会有一天,站在你身边。
泪!就让它往下坠,溅起伤口的美!
别以为,失去的最宝贵,才让今天浪费!
勇敢的说,不再等待!!!
就让光芒折射湿润的瞳孔!
映出心中最想拥有的彩虹!
带我奔向那片有你的天空!
因为你,是我的梦!
我的梦!
我的梦!!
我的梦!!!
就让光芒折射湿润的瞳孔!
映出心中最想拥有的彩虹!
带我奔向那片有你的天空!
因为你,是我的梦!
CCF CSP认证 历年题目自练Day12_第1张图片

你可能感兴趣的:(算法,python,学习方法)