NOIP 提高组初赛 · NOIP 2016 提高组初赛试题 第 27 题

阅读程序 · 答案 i<=jnext[rank[i]]=rank[i+1]higher=height[next[i]]-height[i]shorter<higherprevious[next[i]]=previous[i] · 考点:输入输出、位运算、分支结构、循环结构、STL算法基础、链表

← 整套速查表 NOIP 提高组初赛 全部真题

题目

(交朋友)根据社会学研究表明,人们都喜欢找和自己身高相近的人做朋友。现在有 $n$ 名身高两两不相同的同学依次走入教室,调查人员想预测每个人在 走入教室的瞬间最想和已经进入教室的哪个人做朋友。当有两名同学和这名 同学的身高差一样时,这名同学会更想和高的那个人做朋友。比如一名身高为 $1.80$ 米的同学进入教室时,有一名身高为 $1.79$ 米的同学和一名身高为 $1.81$ 米的同学在教室里,那么这名身高为 $1.80$ 米的同学会更想和身高为 $1.81$ 米的同学做朋友。对于第一个走入教室的同学我们不做预测。由于我们知道所有人的身高和走进教室的次序,所以我们可以采用离线的做法来解决这样的问题,我们用排序加链表的方式帮助每一个人找到在他之前进入教室的并且和他身高最相近的人。(第一空 $2$ 分,其余 $3$ 分)

#include <iostream> 
using namespace std; 
#define MAXN 200000
#define infinity 2147483647
int answer[MAXN], height[MAXN], previous[MAXN], next[MAXN];
int rank[MAXN];
int n;
void sort(int l, int r)
{
    int x = height[rank[(l + r) / 2]], i = l, j = r, temp;
    while (i <= j)
    {
        while (height[rank[i]] < x)
            i++;
        while (height[rank[j]] > x)
            j--;
        if ((____1____))
        {
            temp = rank[i];
            rank[i] = rank[j];
            rank[j] = temp;
            i++;
   

(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
答案:i<=jnext[rank[i]]=rank[i+1]higher=height[next[i]]-height[i]shorter<higherprevious[next[i]]=previous[i]

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构STL算法基础链表 讲解 →链表 真题汇总 →

解题思维

排序后相邻即最近;差等选高;处理完删节点

常见错误

排序后忘连链表;差等选矮;删节点漏更新前驱后继

详细解析(节选)

考点:排序 + 链表维护 + 差值比较

程序在做什么

按身高排序建立双向链表,对每人比较前驱(更矮)和后继(更高)的身高差,差等选后继,随后从链表中删除该人。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断