Другие языки программирования и технологии

Паскаль. Задача не проходит все тесты. Где прокол?

Рамзи Сарнаех создал новую компанию пригородных услуг, которую назвал Нерешенные Идеи (НИ). Пока Рамзи в НИ еще не нанял работников, поэтому он первые несколько месяцев должен работать сам, пока он не сможет расширить свою компанию. Недавно он получил некоторые проекты от правительственных министерств и разбил все проекты на меньшие независимые подпроекты с разными стоимостями. Мы предполагаем, что все подпроекты могут быть выполнены за единицу времени. Рамзи, имея ограниченное время, но будучи оптимистом, хочет знать, сколько, в наилучшем случае, он может заработать, принимая более ценные подпроекты и отклоняя другие.

Входные данные

Первая строка содержит количество тестов. Каждый тест задается одной строкой и начинается с двух целых чисел: времени t, имеющегося в распоряжении Рамзи и количество подпроектов p соответственно (0 ≤ t, p ≤ 1000). За этими двумя числами следует p неотрицательных целых чисел (от 0 до 32767, включительно), которые являются значениями стоимости подпроектов. Все числа в одной строке разделены пробелом.

Выходные данные

Для каждого теста вывести в одной строке максимальную заработанную сумму денег (сумму значений), которую можно достичь в пределах доступного времени Рамзи.

Входные данные
3
3 5 1 1 1 1 1
4 2 161 5
4 7 8 2 9 17 4 4 10
Выходные данные
3
166
44

вот код:

var ans,a:array[1..1000] of longint;
s:string;
i,x,h,j,l,n,k,d,g,p,t:longint;
begin
k := 1;
readln(n);
for i := 1 to n do
begin
readln(s);
s := s + ' ';
t := ord(s[1]) - 48;
p := ord(s[3]) - 48;
for j := 5 to length(s) do
if (s[j] <> ' ') and (j >= g) then
begin
inc(l);

for h := j to length(s) do
if s[h] <> ' '
then inc(d)
else break;
for h := j + d - 1 downto j do
begin
a[l] := a[l] + ((ord(s[h]) - 48) * k);
k := k * 10;
end;
k := 1;
g := j + d;
d := 0;
end;
for j := 1 to l - 1 do
for h := j + 1 to l do
if a[j] < a[h] then
begin
x := a[j];
a[j] := a[h];
a[h] := x;
end;
for j := 1 to t do
ans[i] := ans[i] + a[j];
l := 0;
for j := 1 to p do
a[j] := 0;
g := 0;
p := 0;
t := 0;
end;
for i := 1 to n do
writeln(ans[i]);
end.
Начнём с того, что у тебя совершенно бредово реализован ввод. Числа, разделённые пробелами, вводятся простым read:

read(t, p);
for i := 1 to p do read(a[i]);

И это ВСЁ, что надо для ввода твоих данных!!!

Далее тебе надо отсортировать массив a по убыванию. Причём отсортировать достаточно не весь массив, а только p-t минимальных значений (которые окажутся в конце массива). Т. к. без разницы, в каком порядке суммировать t максимальных значений.

for i := p downto p - t + 1 do begin
k := i;
for j := 1 to i - 1 do if a[j] < a[k] then k := j;
tmp := a[i];
a[i] := a[k];
a[k] := tmp
end;

Дальше надо просуммировать элементы от a[1] до a[min(t, p)]:

k := t;
if p < t then k := p;
sum := 0;
for i := 1 to k do inc(sum, a[i]);

И, наконец, вывести результат:

writeln(sum);

И всё это нужно проделать для каждого теста.

Теперь объединяем всё вместе:

var
a: array[1..1000] of integer;
i, j, k, m, n, t, p, tmp: integer;
sum: longint;
begin
readln(n);
for m := 1 to n do begin
read(t, p);
for i := 1 to p do read(a[i]);
for i := p downto p - t + 1 do begin
k := i;
for j := 1 to i - 1 do if a[j] < a[k] then k := j;
tmp := a[i];
a[i] := a[k];
a[k] := tmp
end;
k := t;
if p < t then k := p;
sum := 0;
for i := 1 to k do inc(sum, a[i]);
writeln(sum)
end
end.
~ Tatarin~
~ Tatarin~
91 737
Лучший ответ
Допустим входная строка

1000 32767 1 2 3 4 ...

Как по-твоему тогда отработает вот эта ересь?:

t := ord(s[1]) - 48;
p := ord(s[3]) - 48;