Задача. Даны натуральные числа [latex]n, a_{1}, a_{2},\ldots, a_{n} (n\geq 4)[/latex]. Числа [latex]a_{1}, a_{2},\ldots , a_{n}[/latex] — это измеренные в сотых долях секунды результаты [latex]n[/latex] спортсменов в беге на [latex]100[/latex] м. Составить команду из четырёх лучших бегунов для участия в эстафете [latex]4\times100[/latex], т.е. указать одну из четверок натуральных чисел [latex]i, j, k, l[/latex], для которой [latex]1\leq i\leq j\leq k\leq l\leq n[/latex] и [latex]a_{i} + a_{j}+a_{k} + a_{l}[/latex] имеет наименьшее значение.
Тесты
n | c | Результаты бега спортсменов | Номера спортсменов, избранных для команды | Комментарий |
6 | 3 | 11.77 12.34 12.14 11.15 11.16 11.40 | 4 5 6 | Пройден |
6 | 4 | 11.68 0 12.15 11.54 11.26 11.00 | Введен отрицательный или нулевой результат | Не пройден |
6 | 2 | 11.68 -12.34 12.14 11.55 11.29 11.00 | Введен отрицательный или нулевой результат | Не пройден |
Код программы на C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <iostream> #include <algorithm> #include <limits> using namespace std; int mini(double x[],int n) //Функция, которая возвращает номер бегуна с наилучшим результатом. { double minn = numeric_limits<double>::infinity(); int mini; for (int i = 0; i < n ; i ++)//Цикл для нахождения минимального значения. { double t = x[i]; if (t <= minn) { mini = i; minn = t; } } return mini; //Возвращение номера минимального значения } void team(double x[], int n, int c)//Функция выводящая на экран номера наилучших спортсменов. { int counters[c]; //Массив номеров бегунов. for (int i = 0; i < c ; i ++) { counters[i] = mini( x , n ); x[ counters[i] ] = numeric_limits<double>::infinity(); } sort(counters, counters + c); //Сортировка номеров бегунов for (int i = 0; i < c ; i ++) { cout<<counters[i] + 1 <<" "; } } int main() { int n, c, k = 0; //Описание переменных для хранения входных данных./ cin>>n>>c; double x[n]; //Описание массива для хранения входных данных.// for (int i = 0; i < n ; i ++) { cin>>x[i]; if (x[i] <= 0) //Проверка массива на отрицательный (либо нулевой) элемент. { cout<<"Введен отрицательный или нулевой результат"; return 0; } } team(x, n ,c); return 0; } |
В строках
41 42 43 44 45 46 47 48 49 |
for (int i = 0; i < n ; i ++) { cin>>x[i]; if (x[i] <= 0) //Проверка массива на отрицательный (либо нулевой) элемент. { cout<<"Введен отрицательный или нулевой результат"; return 0; } } |
мы заполняем массив элементами из входящего потока, при этом уже зная n (количество этих элементов), считав его из входящего потока заранее и проверяем на наличие отрицательного элемента либо нуля (если таковой существует, то выводим сообщение об ошибке и завершаем выполнение программы.
В конечном итоге, применяем функцию team и получаем, собственно, ответ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import java.util.*; import java.lang.*; import java.io.*; class Runners { public static void main (String[] args) throws java.lang.Exception { //Описание переменных для хранения входных данных./ Scanner in = new Scanner(System.in); int n = in.nextInt(); int c = in.nextInt(); int[] counters = new int[c]; //Массив номеров бегунов. int k = 0; double[] x = new double[n]; //Описание массива для хранения входных данных.// for (int i = 0; i < n; i++) x[i] = in.nextDouble(); for (int i = 0; i < c; i++) { double minn = Double.POSITIVE_INFINITY; int mini = 0; for (int j = 0; j < n; j++) //Цикл для нахождения минимального значения. { if (x[j] <= minn) { mini = j; minn = x[j]; } } counters[i] = mini; x[counters[i]] = Double.POSITIVE_INFINITY; } Arrays.sort(counters, 0, c); //Сортировка номеров бегунов for (int i = 0; i < c ; i ++) System.out.printf(counters[i] + 1 + " "); } } |