备战 清华大学 上机编程考试-冲刺前50%,倒数第6天

2024-06-08 21:04

本文主要是介绍备战 清华大学 上机编程考试-冲刺前50%,倒数第6天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

真题训练:

T1:舞蹈团 - 排序+滑动窗口

生活在在外星球X上的小Z想要找一些小朋友组成一个舞蹈团,于是他在网上发布了信息,一共有 \(n\) 个人报名面试。面试必须按照报名的顺序依次进行。小Z可以选择在面试完若干小朋友以后,在所有已经面试过的小朋友中进行任意顺序的挑选,以组合成一个舞蹈团。虽然说是小朋友,但是外星球X上的生态环境和地球上的不太一样,这些小朋友的身高可能相差很大。小Z希望组建的这个舞蹈团要求至少有 \(m\) 个小朋友,并且这些小朋友的最高身高和最低身高之差不能超过 \(k\) 个长度单位。现在知道了这些小朋友的身高信息,问小Z至少要面试多少小朋友才能在已经面试过的小朋友中选出不少于 \(m\) 个组成舞蹈团。

链接:REKCARC-TSC-UHT/大三小学期/保研考试/推研题目/THUPUB2017/statements/tuoj/day1/interview.md at master · PKUanonym/REKCARC-TSC-UHT (github.com)

解:

(在“轩轩”前辈的代码上,做了一些优化)

#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<string>using namespace std;//定义学生类
struct student
{int id;int h;
};//重载小于符号:
bool operator <(const student& a,const student& b)
{return a.h < b.h;
}//利用 插入排序 进行改进:
//这一次不再调用sort(vec.begin()+1,vec.begin()+m+i+1)
//但是,要实现相同的功能,只是内部实现必须更加高效
//前m-1个调用sort
//后面就调用mySort
void mySort(vector<student> &vec,int m,int i)
{//vec[1] - vec[m+i-1]都是有序的,只要把vec[m+i]放到合适的位置即可:student tmp = vec[m+i];for(int u = m+i-1 ; u>=1 ; u--){if(vec[u] < tmp){//把tmp放到u+1的位置,把u+1 - m+i-1后移1个位置for(int w = m+i-1; w>=u+1 ;w--){vec[w+1] = vec[w];}vec[u+1] = tmp;break;}else if(u == 1 && vec[u].h > tmp.h){//tmp需要放到第一个位置for(int w = m+i-1 ; w>=1;w--){vec[w+1] = vec[w];}vec[1] = tmp;break;}}
}int main()
{//处理输入:int n,m,k;cin>>n>>m>>k;//输入n个小朋友的身高vector<student> vec(n+1);for(int i = 1; i<=n;i++){cin>>vec[i].h;vec[i].id = i; //id都是从1开始的}//从1到n一次遍历,选出 m个朋友, 最高 - 最矮  <= k//输出面试完 atleast 个人://其实这个问题挺难的,因为,你要 选择合适的 m个人int atleast = 0;    //至少需要的面试的人数//--大概按照“轩轩”前辈的思路进行求解,但是有所改进sort(vec.begin()+1,vec.begin()+m);for(int i = 0 ;i<= n-m;i++){mySort(vec, m,i) ; //sort(vec.begin()+1,vec.begin()+m+i+1); //sort是左闭右开的for(int j = 1;j<=i+1 ; j++)          //滑动窗口{//检查是否满足 最大 最小的 差值 <=k的条件:if(vec[j+m-1].h - vec[j].h <=k){//搞定:cout<<m+i<<endl;return 0;}}}cout<<"impossible"<<endl;//真的很像一个dp动态规划://那么,怎么设置初始状态 和 转移方程呢?//状态dp[i] : 至少面试了i人,才能获取到的满足 max - min <= k 的最大人数//初始状态dp[1] = 1//转移方程://思路二: 每次加入一个人,都进行一次sort排序://又有一些滑动窗口的感觉//我先写一个朴素的方法://反正只是需要每次检查第i个,只要知道加入了第i个//是否满足即可://这种朴素的方法,存在可以改进的地方,是否可以将前一次的信息利用起来//其中一种做法是,直接暴力://从头m个,m+1个,m+2个,一直到m+(n-m)个,//每次进行sort排序,从头开始 检查, 窗口大小为m的是否满足//虽然“轩轩的代码挺不错的”,但是//我觉得有一点可以改进,就是哪个for(int y = j,y<j+m;y++)找最大id这个循环//是不需要的,因为随着i的逐渐增大,tall一定是(m-1),m,m+1//“否则,我干嘛还要加入后一个元素”——请仔细思考这句话//还有一个可以改进的点,其实不必要每次全部sort,写一个 插入排序或许更优//毕竟前面都是排序好的    return 0 ;
}

这篇关于备战 清华大学 上机编程考试-冲刺前50%,倒数第6天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043301

相关文章

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚: