Петя Васечкин
перешёл в другую школу. На уроке физкультуры ему понадобилось определить своё
место в строю...
Вход. Первая строка содержит количество человек n в классе. Затем задана невозрастающая последовательность из n
чисел, описывающая рост каждого человека в строю. Затем задан рост x Пети. Все числа натуральные и не
превышают 200.
Выход. Выведите номер,
под которым Петя должен стать в строй. Если в строю есть люди с одинаковым
ростом, таким же, как у Пети, то Петя должен стать после них.
Пример
входа 1 |
Пример
выхода 1 |
8 165 163 160 160 157 157 155 154
162 |
3 |
|
|
Пример
входа 2 |
Пример
выхода 2 |
8 165 163 160 160 157 157 155 154 160 |
5 |
бинарный
поиск
Входная
последовательность уже отсортирована в невозрастающем порядке. Найдем место
Пети при помощи бинарного поиска по верхней границе. Нумерация позиций в строю
начинается с 1.
Реализация алгоритма
Читаем входные
данные. Заносим рост школьников в массив v.
scanf("%d",&n);
v.resize(n);
for(i = 0; i < n; i++)
scanf("%d",&v[i]);
scanf("%d",&x);
Если в строю есть люди с ростом, равным Петиному, то Петя
становится после них. Ищем место Пети при помощи бинарного поиска по верхней
границе. Это можно
сделать, так как числа в массиве отсортированы по невозрастанию.
pos =
upper_bound(v.begin(),v.end(),x,greater<int>())
- v.begin();
Выводим место Пети, учитывая что в задаче индексация
школьников начинается с единицы.
printf("%d\n",pos+1);
Реализация с собственным бинарным поиском
#include <cstdio>
#include <vector>
using namespace
std;
int i, n, x, pos;
vector<int> v;
int main(void)
{
scanf("%d",&n);
v.resize(n+1);
for(i = 1; i
<= n; i++)
scanf("%d",&v[i]);
scanf("%d",&x);
int Left = 1,
Right = n + 1, Middle;
while(Left
< Right)
{
Middle = (Left + Right) / 2;
if (x <=
v[Middle]) Left = Middle + 1; else Right =
Middle;
}
printf("%d\n",Left);
return 0;
}