正在载入在线练习界面,本页内容可直接阅读…
AK CSP › NOIP 提高 2016 第一轮真题 › 第 30 题
NOIP 提高 2016 第一轮 第 30 题:完善程序(交朋友)第 4 空
题目
(交朋友)根据社会学研究表明,人们都喜欢找和自己身高相近的人做朋友。现在有 $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++;
j--;
}
}
if (i < r)
sort(i, r);
if (l < j)
sort(l, j);
}
int main()
{
cin >> n;
int i, higher, shorter;
for (i = 1; i <= n; i++)
{
cin >> height[i];
rank[i] = i;
}
sort(1, n);
for (i = 1; i <= n; i++)
{
previous[rank[i]] = rank[i - 1];
(2);
}
for (i = n; i >= 2; i--)
{
higher = shorter = infinity;
if (previous[i] != 0)
shorter = height[i] - height[previous[i]];
if (next[i] != 0)
(3);
if ((4))
answer[i] = previous[i];
else
answer[i] = next[i];
next[previous[i]] = next[i];
(5);
}
for (i = 2; i <= n; i++)
cout << i << ":" << answer[i];
return 0;
}本小题
第 4 空应填( )
答案
shorter<higher
题解
考点定位
本题(交朋友第④空)考「取较近者」,对应大纲 3.2.3 链表(难度【3】)。
解题过程
④处两侧差值比较(平局取高者=右侧 higher):
``cpp if (shorter < higher) ``
(矮侧更近才选矮者,否则选高者。)答案:shorter<higher。
易错提醒
① 规则「身高差相同取高者」⇒ 严格 < 才选矮;② answer[i] 的赋值随分支。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号