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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Катание на коньках., Составить задачу которая сортирует по очкам.
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

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


Привет. Такая задача:
В соревнование по артистическому катанию на льду играли N игроков. Они набрали очков из интервала [0..100]. Очки это вещественые числа формата: aa.bb. Составить програму которая показывает К финалистов т.е сортировать по убыванию этих N и показать только К из них.

Пример:
IN:
15 9
8.5 9.5 8.5 7.5 7.7 7.5 7.7 8.5 5.5 6.3 7.4 7.5 8.5 9.1 9.8
OUT:
9.80 9.50 9.10 8.50 8.50 8.50 8.50 7.70 7.70

0<=N,K<=30000;
Время выполнения < 1 сек

Так как вектор 1..30000 вещественых чисел слишком большая структура то я сделал так:
Массив 0..100, 0..100 где координата i - целая часть а j - дробная часть числа из файла.

Вот код, для больших чисел работает вроде.

Uses Crt;
type vector=array[0..10000] of integer;
var N,K:integer; max:integer;
a:vector;
procedure START;
var i:integer; jcor:integer;
nr:real;
F:text;
begin
assign(F, 'C:\tpatinaj\patina.in');
reset(F);
readln(F, N, K);
max:=0;
for i:=1 to N do
begin
read(F, nr);
icor:=round(nr*100);
if icor >max then max:=icor;
inc(a[icor]);
end;
close(F);
end;
procedure Print; //Выводим всё в файл
var i:integer; r:integer; G:text;
begin
assign(G, 'C:\patina.out');
rewrite(G);
i:=max;
r:=0;
while r<k do
begin
nr:=i/100;
while a[i]>0 do
begin
write(G, nr:5:2,' ');
inc®;
dec(a[i]);
if r=k then exit;
end;
dec(i);
end;
close(G);
end;
Begin ClrScr;
START;
Print;
end.


Проблемы:
1) Для примера показаного выше в файл ничего не пишет, но если написать чтоб выводил на экран то всё выводит.
2) Почему-то когда nr=70.0 то trunc(nr)=69 тоже не пойму.
3) Не уверен что правильно выводит решение.
прикрепил тесты.

Сообщение отредактировано: DarkWishmaster -


Прикрепленные файлы
Прикрепленный файл  tpatinaj.rar ( 455.24 килобайт ) Кол-во скачиваний: 279
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


Подробно твой код пока не смотрел, но и не уверен, что стОит. Вот эти слова:
Цитата(DarkWishmaster @ 27.06.2011 19:21) *
Так как вектор 1..30000 вещественых чисел слишком большая структура
- говорят о том, что ты все еще -ходишь-в-лаптях- используешь TP mega_chok.gif.

Цитата
то я сделал так:
Массив 0..100, 0..100 где координата i - целая часть а j - дробная часть числа из файла
Идея верная - не потому, что тот массив слишком большой, а потому что так проще для сортировки (сортировка подсчетом). Но мне неясно, зачем массив двумерный. Не проще ли завести массив из 10000 целых, а индекс находить так:
i:= Round(x*100);
- без всяких там целых/дробных частей?


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


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

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


Цитата(Lapp @ 27.06.2011 21:12) *

Подробно твой код пока не смотрел, но и не уверен, что стОит. Вот эти слова:
- говорят о том, что ты все еще -ходишь-в-лаптях- используешь TP mega_chok.gif.

Идея верная - не потому, что тот массив слишком большой, а потому что так проще для сортировки (сортировка подсчетом). Но мне неясно, зачем массив двумерный. Не проще ли завести массиы из 10000 целых, а индекс находить так:
i:= Round(x*100);
- без всяких там целых/дробных частей?

Проще! щя редактирую, спасибо =))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


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

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

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


Зря ты стал редактировать старый пост. После этого тему можно выбрасывать - никто уже не сможет разобраться в ней: слова одни, код другой.. norespect.gif Да и ошибки в коде.. Видимо, надо сокращать время редактирования до часа или меньше.

Файл у тебя пустой, потому что ты его не закрываешь. С оператором exit нужно быть предельно осторожным. Он не структурный, а потому практически такой же вредный, как и goto. Корни твоей ошибки в том, что ты выделил запись в файл в отдельную процедуру. Само по себе это не плохо (хотя тут совершенно не нужно), но ты забыл ЗАЧЕМ ты это сделал (а потому и забыл, что бессмысленное действие) и спутал функциональность цикла записи и всего акта записи (открытие файла, цикл, закрытие). Тут больше подошел бы break, но им я тоже пользоваться не советую (по той же причине). Самое же смешное состоит в том, что этот оператор if вообще не нужен, поскольку у тебя это уже есть в условии while. lol.gif Структуру этого цикла я бы тоже переделал, примерно вот так: [неправильно, см. ниже]
     while r<k do begin
for j:=1 to a[i] do Write(g,i/100:6:2);
r:= r+a[i];
dec(i)
end;


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


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

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


Цитата(Lapp @ 28.06.2011 4:53) *

Зря ты стал редактировать старый пост. После этого тему можно выбрасывать - никто уже не сможет разобраться в ней: слова одни, код другой.. norespect.gif Да и ошибки в коде.. Видимо, надо сокращать время редактирования до часа или меньше.

Файл у тебя пустой, потому что ты его не закрываешь. С оператором exit нужно быть предельно осторожным. Он не структурный, а потому практически такой же вредный, как и goto. Корни твоей ошибки в том, что ты выделил запись в файл в отдельную процедуру. Само по себе это не плохо (хотя тут совершенно не нужно), но ты забыл ЗАЧЕМ ты это сделал (а потому и забыл, что бессмысленное действие) и спутал функциональность цикла записи и всего акта записи (открытие файла, цикл, закрытие). Тут больше подошел бы break, но им я тоже пользоваться не советую (по той же причине). Самое же смешное состоит в том, что этот оператор if вообще не нужен, поскольку у тебя это уже есть в условии while. lol.gif Структуру этого цикла я бы тоже переделал, примерно вот так:
     while r<k do begin
for j:=1 to a[i] do Write(g,i/100:6:2);
r:= r+a[i];
dec(i)
end;


Понял! Спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


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

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

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


Цитата(DarkWishmaster @ 28.06.2011 14:09) *
Понял! Спасибо!

Упс! Взгляд с утра на свежую голову - лучшее средство для поиска ошибок у себя..
Тот цикл будет работать неправильно. Надо вот так:
     while r<k do
if a[i]>0 then begin
Write(g,i/100:6:2);
Inc®;
Dec(a[i])
end
else dec(i)
end;

Извиняюсь за дезу.. ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 23.12.2024 21:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name