IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Треугольные волны
klem4
сообщение 1.12.2010 22:43
Сообщение #1


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Всем привет smile.gif

Решил в качестве хобби в последнее время убить двух зайцев, поизучать с++ и порешать интересные задачки, нашел сайт с онлайнтестером и начал решать. На одной из задач (достаточно простой по моему мнению), мне упорно заявляют Wrong answer mad.gif Где и в чем моя ошибка я понять не могу, подозреваю, что в силу недостаточного знания английского, не точно понял формат ввода/вывода данных или часть условия, хотя все кажется ясным.

Задание (на английском языке) находится тут: http://acm.uva.es/p/v4/488.html
Еще одно описание с тестовыми данными тут: http://www.algorithmist.com/index.php/UVa_488
Онлайн судья тут: http://uva.onlinejudge.org/

мой код тут:


#include <iostream>
#include <string>
#include <vector>

using namespace std;

int tests, freq, ampl;
string blank, result_str;

string get_wave( int a )
{
	string wave;
	vector<string> lines;

	for (int i = 0; i < a; i++ )
	{
		string line;
		char c = (char)(49 + i);

		for ( int j = 0; j <= i; j++ )
		{
			line.push_back(c);
		}
		lines.push_back(line);
	}

	for (int i = 0; i < 2 * a - 1; i++)
	{
		int idx = i < a ? i : (2*a - i - 2);

		wave.append(lines[idx]);
		wave.append("\n");
	}

	return wave;
}

int main()
{

	cin >> tests; // читаем кол-во тестов
	getline( cin, blank ); // читаем пустую строку

	while ( --tests >= 0 )
	{
		cin >> ampl; // по каждому тесту читаем 2 подрят идущих строки с амплитудой и частотой
		cin >> freq;
                // далее никаких пустых строк не читаем, получаеим и сохраняем результат для данного теста и переходим к чтению следующих 2-х строк (если это не последний тест)
		string wave = get_wave( ampl );
		for (int i = 0; i < freq; ++i )
		{
			result_str.append( wave );
			if (!( i == freq - 1 && tests == 0))
			{
				result_str.append("\n");
			}
			else
			{
				result_str.erase(result_str.length() - 1);
			}
		}
	}

	cout << result_str;
    return 0;
}



Сообщение отредактировано: klem4 - 1.12.2010 23:24


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 1.12.2010 23:10
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(klem4 @ 1.12.2010 22:43) *
подозреваю, что в силу недостаточного знания английского, не точно понял формат ввода/вывода
Я подозреваю, что дело в пустых строках.. Проверить сейчас не могу (. Пришли, плз, результат работы с такими входными данными:
2

3
2

4
3

Только постарайся точнее. То есть, выведи в файл t.txt, например, и прикрепи сюда.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.12.2010 23:29
Сообщение #3


Гость






Цитата
Я подозреваю, что дело в пустых строках..
Нет... Только что проверил (принудительно читал пустую строку после каждой пары Ampl/Freq), он все равно выдает Wrong Answer (klem4, я твой код не спалил, по-другому сделал чуть-чуть, если надо - потом объясню, ты много лишнего делаешь, все проще гораздо, в STL много разных конструкторов, циклы не нужны)
 К началу страницы 
+ Ответить 
klem4
сообщение 1.12.2010 23:34
Сообщение #4


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Lapp, В приведенном тобой наборе входных данных между парами амплетуды и частоты есть пустая строка, в тестовом примере на этой странице, ее нету
3
2
4
3
, а на странице онлайтестера приведены данные для одного теста sad.gif

Если адаптировать чтение данных учитывая этот пробел, результат будет такимже как и без него smile.gif . Файл присоединяю. И добавляю комментарии в код.

добавлено: volvo, было бы интересно посмотреть на более короткое решение, с STL только недавно познакомился)

Сообщение отредактировано: klem4 - 1.12.2010 23:43


Прикрепленные файлы
Прикрепленный файл  t.txt ( 100 байт ) Кол-во скачиваний: 216


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 1.12.2010 23:55
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(klem4 @ 1.12.2010 23:34) *
Lapp, В приведенном тобой наборе входных данных между парами амплетуды и частоты есть пустая строка, в тестовом примере на этой странице, ее нету

Гм.
Цитата
, and there is also a blank line between two consecutive inputs
- как тогда понимать это? Видимо, так, что input != set, и может быть несколько input'ов.. ??


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.12.2010 1:20
Сообщение #6


Гость






В общем, у меня получилось вот так:

#include <iostream>
#include <vector>
#include<iterator>

using namespace std;

void get_wave(int ampl)
{
        for(int j = 1; j <= ampl; j++)
        {
            vector<int> v(j, j);
            copy(v.begin(), v.end(), ostream_iterator<int>(cout, ""));
            cout << endl;
        }

        for(int j = ampl - 1; j > 0; j--)
        {
            vector<int> v(j, j);
            copy(v.begin(), v.end(), ostream_iterator<int>(cout, ""));
            cout << endl;
        }
}

int main()
{
	long tests;
	while(cin >> tests)
	{
		long ampl, freq;
		for(long k = 1; k <= tests; k++)
		{
			cin >> ampl >> freq;
			for(long i = 1; i <= freq; i++)
			{
				get_wave(ampl);
				if(i < freq || k < tests) { cout << endl; }
			}
		}
	}
	return 0;
}

. Они действительно подразумевают возможность нескольких input-ов...

klem4, можно, наверное, и в одну строку все вытягивать, но по-моему, смысла нет, лучше печатать порцию после каждого input-а... (я переделал на vector<int>, чтоб с твоим решением не совпадало, а то мало ли, может они там отслеживают unsure.gif )
 К началу страницы 
+ Ответить 
klem4
сообщение 5.12.2010 20:10
Сообщение #7


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Я так понимаю, этот вариант тебе сдать удалось ? Не очень ясно, чтоже надо ввести, чтобы внешний while закончился) Если только не цифру.. unsure.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
-Volvo-
сообщение 5.12.2010 20:45
Сообщение #8


Гость






Не надо "не цифру", введи Ctrl+Z - это остановит работу с потоком (и это то, что сделает онлайн-тестер), и все корректно завершится.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 17.07.2025 21:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"