С.А.Абрамов. Задачи по программированию.
Задача
Даны действительные числа [latex]r_{1},\ldots,r_{n}[/latex], среди которых заведомо есть как отрицательные, так и не отрицательные. Получить [latex]x_{1}y_{1}+\ldots+x_{s}y_{s}[/latex], где [latex]x_{1},\ldots,x_{p}[/latex] — отрицательные члены последовательности [latex]r_{1},\ldots,r_{n}[/latex], взятые в порядке следования, [latex]y_{1},\ldots,y_{q}[/latex] — неотрицательные члены, взятые в обратном порядке, [latex]s=min\left ( p,q \right )[/latex] .
Тесты
Входные данные | Выходные данные |
-1 1 | -1 |
-1 | 0 |
-1 -1 | 0 |
1 2 -5 10 -2 | -54 |
4 6 3 4 -8 2 7 5 | -40 |
Код программы
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 |
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { double r, sum=0; int s; vector <double> x; vector <double> y; while(cin >> r){ if(r<0){ x.push_back(r); } else y.push_back(r); } s = min(x.size(), y.size()); for(int i=0; i < s; i++){ sum += x[i] * y.back();/* умножение отрицательных чисел в порядке следования на неотрицательные в обратном порядке */ y.pop_back(); } cout << sum; return 0; } |
Решение
Считывая числа из входного потока, выполняем проверку и записываем положительные в вектор [latex]y[/latex], отрицательные — в вектор [latex]x[/latex]. Затем вычисляем [latex]s[/latex]. Вычисляем [latex]x_{1}y_{1}+\ldots+x_{s}y_{s}[/latex].
Зачтено.
Странно вы проходите по вектору y. Вообще для этих целей логичнее использовать итераторы — прямой для х и реверсивный для у.