CCF CSP认证 历年题目自练Day14

news2024/12/1 8:33:59

CCF CSP认证 历年题目自练Day14

题目一

小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。
  请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕。
输入格式
  输入的第一行包含了两个整数n, k,意义如上所述。
  第二行包含n个正整数,依次表示a1, a2, …, an。
输出格式
  输出一个整数,表示有多少个朋友分到了蛋糕。
样例输入
6 9
2 6 5 6 3 5
样例输出
3
样例说明
  第一个朋友分到了前3块蛋糕,第二个朋友分到了第4、5块蛋糕,第三个朋友分到了最后一块蛋糕。
评测用例规模与约定
  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 10000,1 ≤ ai ≤ 1000。

题目分析(个人理解)

  1. 简单题直接看输入,n是有几块蛋糕,k是每个小朋友最少分到到重量。
  2. n,k=map(int,input().split())
  3. 第二行输入小明拥有的每块蛋糕的重量。我选择列表存储,核心算法是这样的,从,小明拥有的第一个蛋糕开始算起,满足大于等于k的,计数器加一(计数器用来统计能给几个小朋友发),不满足的遍历小明拥有的蛋糕的重量,一直到满足大于等于k,计数器加一,一直把小明的蛋糕遍历完,最后输出计数器,如果最后一块蛋糕即使不满足条件,也要发给小朋友
  4. num_list=list(map(int,input().split()) num_list[]存储每块蛋糕的重量。
  5. result=0#计数能给几个小朋友发蛋糕。
  6. temp作为累加器,统计每一次遍历的蛋糕重量是否满足条件,满足则归零做下一次统计。
  7. 完整代码如下!!!
n,k=map(int,input().split())
num_list=list(map(int,input().split()))
result=0
temp=0
for i in range(n):
	temp=temp+num_list[i]
	if temp>=k:
		result+=1
		temp=0
if temp>0:
	result+=1
print(result)

题目二

问题描述
体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列。
例如,下面给出了一组移动的例子,例子中学生的人数为8人。
0)初始队列中学生的学号依次为1, 2, 3, 4, 5, 6, 7, 8;
1)第一次调整,命令为“3号同学向后移动2”,表示3号同学出队,向后移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5, 3, 6, 7, 8;
2)第二次调整,命令为“8号同学向前移动3”,表示8号同学出队,向前移动3名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5, 8, 3, 6, 7;
3)第三次调整,命令为“3号同学向前移动2”,表示3号同学出队,向前移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 3, 5, 8, 6, 7。
小明记录了所有调整的过程,请问,最终从前向后所有学生的学号依次是多少?
请特别注意,上述移动过程中所涉及的号码指的是学号,而不是在队伍中的位置。在向后移动时,移动的距离不超过对应同学后面的人数,如果向后移动的距离正好等于对应同学后面的人数则该同学会移动到队列的最后面。在向前移动时,移动的距离不超过对应同学前面的人数,如果向前移动的距离正好等于对应同学前面的人数则该同学会移动到队列的最前面
输入格式
输入的第一行包含一个整数n,表示学生的数量,学生的学号由1到n编号。
第二行包含一个整数m,表示调整的次数。
接下来m行,每行两个整数p, q,如果q为正,表示学号为p的同学向后移动q,如果q为负,表示学号为p的同学向前移动-q。
输出格式
输出一行,包含n个整数,相邻两个整数之间由一个空格分隔,表示最终从前向后所有学生的学号。
样例
输入:

8
3
3 2
8 -3
3 -2
1
2
3
4
5
输出:

1 2 4 3 5 8 6 7
1
评测用例规模与约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移动均合法。

题目分析(个人理解)

  1. 还是先看输入,第一行输入n个整数,直接n=int(input())
  2. 给n个空间,还是选择列表存储先看看行不行,给一个列表l[],我用列表的值代表学生的编号,尤其注意编号从1开始,所以,for i in range(1,n+1)
  3. 接着再看输入的第二行,确定要改变的学生的个数,常规输入即可,m=int(input())
  4. 后面的就是输入哪个编号的学生要改变,怎样改变位置的输入,我用p表示要改变的学生的编号,q表示怎样改变。
  5. for i in range(m):
    p,q=map(int,input().split())
  6. 到核心部分了!对于学生怎样移动有两种情况,第一种情况是选中的学生向后移动,那么必然有如下步骤,比如,我要将位序为i的编号向后移动n个单元,首先把要移动的学生编号拿出去,假如我要移动的学生编号在位序为 i 的位置,先把 i 号位置的编号存到另一个列表,然后将 i+1 到 i+n 位置的编号位序加1(即实现前移操作),最后将拿出来的学生编号插入i+n位置即可
  7. 第二种情况是选中的学生向前移动,可以类比向后移动去思考,同理可得代码。
  8. 完整代码如下!!!
n=int(input())
l=[]
for i in range(1,n+1):
    l+=[i]
m=int(input())
for i in range(m):
    p,q=map(int,input().split())
    if q>0:# 后移
        for j in range(n):# 找到所要移动的元素位置,用k记录
            if l[j]==p:
                k=j
                continue
        st=l[k]#把改变的编号拎出来,单独存
        for j in range(q):# 将k+1到k+q位置的元素前移一个位置
            l[k+j]=l[k+j+1]
        l[k+q]=st#把拎出来的插入
    else:# 前移
        for j in range(n):
            if l[j]==p:
                k=j
                continue
        st=l[k]#把改变的编号拎出来,单独存
        for j in range(abs(q)):#abs为绝对值函数---k-j---k-j-1
            l[k+j]=l[k+j-1]
        l[k+q]=stst#把拎出来的插入

print(l[0],end='')
for i in range(1,n):
    print('',l[i],end='')

  1. 你以为这就完了?当然不能,还有第二种方法!!!
  2. 可以把要改变的编号和改变多少个位置分别存储在两个列表中。
  3. 这里核心算法有一些改变,我还是先将要改变位置的编号找到,然后直接用pop()放法直接删除,然后再把删除的,(也就是要改变的编号)插入它该在的位置即可,这样比第一种方法简单很多。不用考虑是向前还是向后,全部在存储改变位置的列表中体现。
  4. 我选择index()函数和pop()函数会复杂的问题简单化。pop()函数返回删除的值。index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
    语法
    index()方法语法:
    list.index(x[, start[, end]])
    参数
    x-- 查找的对象。
    start-- 可选,查找的起始位置。
    end-- 可选,查找的结束位置。
    返回值
    该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
    实例
    List = [‘123’, ‘abc’, ‘teacher’, ‘school’]
    print("abc索引位置: ", List.index(‘abc’))
    print("123索引位置 : ", List.index( ‘123’, 0, 3 ))
    1
    2
    3
    4
    返回结果如下:
    abc索引位置: 1
    123索引位置 : 0
  5. 直接上代码!!!
n=int(input())#总共有几个学生
m=int(input())  #调整次数
list_a=[]    #调整学生
list_b=[]   #调整的操作存储
#生成学号
stu=[int(i) for i  in  range(1,n+1)]#迭代写入
for  i  in range(m):
    a,b=map(int,input().split())
    list_b.append(b)
    list_a.append(a)
#print(list_b,list_a,stu)
for  i  in  range(m):
    k=stu.index(list_a[i])  #获取被删除元素索引
    obj=stu.pop(k)   #s删除此位置的值
    stu.insert(k+list_b[i],obj)#插入删除的值
    #print(stu)
for i in range(len(stu)):
    print(stu[i],end=' ')


总结

对于python熟悉每个函数和方法的用法至关重要!!!
请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【进阶C语言】动态内存分配

本章大致内容介绍: 1.malloc函数和free函数 2.calloc函数 3.realloc函数 4.常见错误案例 5.笔试题详解 6.柔性数组 一、malloc和free 1.malloc函数 (1)函数原型 函数参数:根据用户的需求需要开辟多大的字节空间&#xff…

nodejs+vue 网上招聘系统elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性: 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …

【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)

文章目录 0. 前言1. Cifar10数据集1.1 Cifar10数据集下载1.2 Cifar10数据集解析 2. LeNet5网络2.1 LeNet5的网络结构2.2 基于PyTorch的LeNet5网络编码 3. LeNet5网络训练及输出验证3.1 LeNet5网络训练3.2 LeNet5网络验证 4. 完整代码4.1 训练代码4.1 验证代码 0. 前言 按照国际…

Spring Boot 常用注解详解:全面指南

Spring Boot 中有许多常用的注解,这些注解用于配置、管理和定义 Spring Boot 应用程序的各个方面。以下是这些注解按大类和小类的方式分类,并附有解释和示例。 一、Spring Boot 核心注解 SpringBootApplication 解释:这是一个组合注解&a…

反射学习笔记

反射学习笔记 一、反射入门案例 在反射中,万物皆对象,方法也是对象。反射可以在不修改源码的情况下,只需修改配置文件,就能实现功能的改变。 实体类 /*** 动物猫类*/ public class Cat {private String name;public void hi()…

openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86

文章目录 openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x8684.1 BIOS84.2 操作系统环境设置84.3 网络 openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86 …

大学各个专业介绍

计算机类 五米高考-计算机类 注:此处平均薪酬为毕业五年平均薪酬,薪酬数据仅供参考 来源: 掌上高考 电气类 五米高考-电气类 机械类 五米高考-机械类 电子信息类 五米高考-电子信息类 土木类 五米高考-土木类

Cloudflare进阶技巧:缓存利用最大化

1. 引言 cloudflare我想你应该知道是什么,一家真正意义上免费无限量的CDN,至今未曾有哥们喷它的。当然,在国内的速度确实比较一般,不过这也不能怪它。 CDN最大的特色,我想就是它的缓存功能,达到防攻击&am…

【数据结构】归并排序、基数排序算法的学习知识点总结

目录 1、归并排序 1.1 算法思想 1.2 代码实现 1.3 例题分析 2、基数排序 2.1 算法思想 2.2 代码实现 2.3 例题分析 1、归并排序 1.1 算法思想 归并排序是一种采用分治思想的经典排序算法,通过将待排序数组分成若干个子序列,将每个子序列排序&#xff…

安卓玩机-----给app加注册码 app加弹窗 云注入弹窗

在对接很多工作室业务中有些客户需要在他们自带的有些app中加注册码或者验证码的需求。其实操作起来也很简单。很多反编译软件有自带的注入功能。例如注入弹窗。这个是需要对应的注册码来启动应用。而且是随机id。重新安装app后需要重新注册才可以继续使用,原则上可…

Ubuntu 20.04部署Promethues

sudo lsb_release -r可以看到操作系统版本是20.04,sudo uname -r可以看到内核版本是5.5.19。 sudo wget -c https://github.com/prometheus/prometheus/releases/download/v2.37.1/prometheus-2.37.1.linux-amd64.tar.gz下载必要的组件。 tar -zxf prometheus-2.…

python对RabbitMQ的简单使用

原文链接:https://blog.csdn.net/weixin_43810267/article/details/123914324 RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消…

日常学习之:如何基于 OpenAI 构建自己的向量数据库

文章目录 原理前期准备依赖安装Pinecone 数据库注册Index 创建(相当于传统数据库中的创建 table) 基于 pinecone 数据库的代码实现尝试用 OpenAI 的 API 构建 embedding将示例的数据 embedding 后写入你的 pinecode (构建向量数据库&#xff…

【三次握手、四次挥手】TCP建立连接和断开连接的过程、为什么需要三次握手,为什么需要四次挥手、TCP的可靠传输如何保证、为什么需要等待2MSL等重点知识汇总

目录 三次握手 为什么握手需要三次 四次挥手 为什么挥手需要四次 TCP的可靠传输如何保证 TIME_WAIT等待的时间是2MSL 三次握手 三次握手其实就是指建立一个TCP连接。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的…

【【萌新的RISCV学习之流水线通路的控制-8】】

萌新的RISCV学习之流水线通路的控制-8 我们在之前学习了整个单周期的模块工作流程 我们按照整体的思路分段 将数据通路划分为5个阶段 IF : 取地址 ID :指令译码和读存储器堆 EX :执行或计算地址 MEM : 数据存储器访问 WB : 写回 单周期数据通路&…

Three.js加载360全景图片/视频

Three.js加载360全景图片/视频 效果 原理 将全景图片/视频作为texture引入到three.js场景中将贴图与球形网格模型融合,将球模型当做成环境容器使用处理视频时需要以dom为载体,加载与控制视频动作每次渲染时更新当前texture,以达到视频播放效…

强化学习到底是什么?它是怎么运维的

https://mp.weixin.qq.com/s/LL3HfU2iNlmSqaTX_3J7fQ 强化学习是一种行为学习模型,由算法提供数据分析反馈,引导用户逐步获取最佳结果。 来源丨Towards Data Science 作者丨Jair Ribeiro 编译丨科技行者 强化学习属于机器学习中的一个子集,它使代理能够理解在特定环境中…

TensorFlow入门(四、数据流向机制)

session与"图"工作过程中存在的两种数据的流向机制,即:注入机制和取回机制 注入机制(feed):即通过占位符向模式中传入数据 取回机制(fetch):指在执行计算图时,可以同时获取多个操作节点的计算结果 实例代码如下: import tensorflow.compat.v1 as tftf…

【Java】建筑工地智慧管理系统源码

智慧工地系统运用物联网信息技术,致力于推动建筑工程行业的建设发展,做到全自动、信息化,智能化的全方位智慧工地,实现工程施工可视化智能管理以提高工程管理信息化水平。 智慧工地平台拥有一整套完善的智慧工地解决方案&#xff…

C语言入门Day_27 开发环境

前言: 在线编译环境涉及到联网,如果在没有网的情况下,我们就不能写代码了,这一章节,我们将会给大家介绍一下如何搭建一个本地的C语言编译环境。 如果想要设置 C 语言环境,需要确保电脑上有以下两款可用的…