Рамзи Сарнаех создал новую компанию пригородных услуг, которую назвал Нерешенные Идеи (НИ). Пока Рамзи в НИ еще не нанял работников, поэтому он первые несколько месяцев должен работать сам, пока он не сможет расширить свою компанию. Недавно он получил некоторые проекты от правительственных министерств и разбил все проекты на меньшие независимые подпроекты с разными стоимостями. Мы предполагаем, что все подпроекты могут быть выполнены за единицу времени. Рамзи, имея ограниченное время, но будучи оптимистом, хочет знать, сколько, в наилучшем случае, он может заработать, принимая более ценные подпроекты и отклоняя другие.
Входные данные
Первая строка содержит количество тестов. Каждый тест задается одной строкой и начинается с двух целых чисел: времени 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.
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.
Допустим входная строка
1000 32767 1 2 3 4 ...
Как по-твоему тогда отработает вот эта ересь?:
t := ord(s[1]) - 48;
p := ord(s[3]) - 48;
1000 32767 1 2 3 4 ...
Как по-твоему тогда отработает вот эта ересь?:
t := ord(s[1]) - 48;
p := ord(s[3]) - 48;
Похожие вопросы
- Паскаль Задача
- кто может помочь с паскаль(задачи)?
- Помогите,пожалуйста,решить задачу на двумерные массивы,в паскале.(задача вн.)Спасибо.
- как сделать в Паскале задачу/программу по переводу числа из десятичной в римскую систему счисления???
- Где ошибка Паскаль задача счастливый билет
- ПАСКАЛЬ! задача!
- Помогите с Паскалем!! задача
- Pascal. Помогите пожалуйста решить задачу в паскале !
- Как ответ на эту задачу записать в паскале, либо просто в алгоритм?
- Помогите решить задачу на Турбо паскале