备战 清华大学 上机编程考试-冲刺前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

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

剑指offer—编程题7(用两个栈实现一个队列)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 代码如下: [java]  view plain copy print ? public class Test07 {       /**       * 用两个栈模拟的队列       *

剑指Offer—编程题4 ( 替换空格)

一、题目:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。    在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。

剑指Offer—编程题56(链表中环的入口地址)

题目:一个链表中包含环,如何找出环的入口结点? 解题思路   可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。    剩下的问题就是如何得到环中结点的数目。我们在面试题15的第二个相关题目时用到

剑指Offer—编程题15(链表中倒数第k个结点)

题目:输入一个链表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点. public static class ListNode {int value;ListNode next;} 解题思路: