Задача
Тесты
Ввод
|
Вывод |
1 2 3 4 5 6 7 8 9 10 | 1 6 2 7 3 8 4 9 5 10 |
8 25 3 7 | 8 3 25 7 |
5.5 6.025 2.387 1.0986 7.762 3.5958 | 5.5 1.0986 6.025 7.762 2.387 3.5958 |
Хороший код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include <vector> using namespace std; int main() { vector <double> s; vector <double> l; double a,n; while(cin>>a) { s.push_back(a); } n=s.size()/2; for(int i=0;i<n;i++) { l.push_back(s.at(i)); l.push_back(s.at(i+n)); } for(int i=0;i<l.size();i++) { cout<<l.at(i)<<" "; } return 0; } |
Решение
Считываем действительные числа в первый вектор и узнаем [latex]n[/latex]. Затем поочередно вписываем элементы и элементы с измененным индексом в другой вектор, пока счетчик не будет равен [latex]n[/latex] и выводим полученный вектор, он и будет ответом.
Лучший код на 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 |
#include <iostream> #include <vector> using namespace std; int main() { vector <double> s; double a,n; int b=0; while(cin>>a) { s.push_back(a); } n=s.size()/2; for(int i=0;i<n;i++) { s.insert(s.begin()+2*i+1,s.at(n+b+i)); b++; } s.resize(2*n); for(int i=0;i<s.size();i++) { cout<<s.at(i)<<" "; } return 0; } |
Лучший код на Java
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 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); Vector a = new Vector(); while(in.hasNextDouble()){ a.add(in.nextDouble()); } int n=a.size()/2; int b=0; for(int i=0;i<n;i++){ a.add(2*i+1,a.get(n+b+i)); b++; } a.setSize(2*n); Double[] s = new Double[a.size()]; a.toArray(s); for(int i=0;i<s.length;i++){ System.out.print(s[i]+" "); } } } |
Решение
В первом способе мы задавали два вектора, чем естественно увеличивали занимаемую память. C помощью функции insert() мы можем вставлять элементы в вектор, не используя дополнительных средств. Однако мы сталкиваемся с тем, что функция по определению вставляет в вектор константу из-за чего наш цикл не будет правильно работать. Чтобы изменять параметр вводимого элемента, заводим отдельный счетчик. Теперь каждый [latex]2*i+1[/latex]-ый шаг мы вставляем [latex]n+b+i[/latex]-ый элемент вектора. Проведем resize() вектора чтобы убрать лишние элементы и получим готовый результат.
Почти хорошо. Но Ваше решение требует дополнительной памяти по числу элементов.
Сделайте, пожалуйста, второй вариант программы только с одним вектором. Вы же знаете, что элементы можно вставлять в любое место вектора?
Т.е. просто читаете значения и вставляете элементы в нужную позицию. Осталось придумать алгоритм определения нужной позиции.
— Ссылка на «лучший» код ведет не туда.
— Размер вектора увеличивается в полтора раза. Из {1 2 3 4} получается не {1 3 2 4}, а {1 3 2 4 3 4}. Вы этого не заметили т.к. печатаете не до конца — s.size().
Игорь Евгеньевич, вы предлагаете удалять те элементы?
Объясните, пожалуйста, зачем Вам понадобилась эта проверка в коде печати if(s[i]==s[i].intValue())?.
Чтобы целые числа печатать как 1, а не 1.0. Просто для красоты