Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 32

Оптимизация решения олимпиадной задачи

18.08.2019, 01:02. Показов 815. Ответов 1

Студворк — интернет-сервис помощи студентам
Всех приветствую. Недавно наткнулся на очень интересную олимпиадную задачу. Полностью переводить её не буду (данная задача представляется на украинском), но скажу основную суть: вводятся размерность - n и два массива с данной размерностью - заглавный и побочный, в файл "minions.in". В выходной файл "minions.out" необходимо написать минимальную цену для массива из одного, двух, трёх, ... , n элементов. Цена массива вычисляется так - n-1 элементов главного массива + 1 элемент побочного. В цене ДОЛЖЕН быть ОДИН элемент побочного массива.
Приведу примеры входных и выходных данных:
-----------------------------
minions.in | minions.out
3 |1
1 4 |2
3 3 |5
2 1 |
-----------------------------
-----------------------------
minions.in | minions.out
5 |2
3 4 |5
3 3 |8
2 4 |11
4 3 |15
5 3 |
-----------------------------
Примечания к примерам:
- Первое число - размерность массивов;
- 1 столбец чисел - побочный массив, 2 столбец - главный;
Чтобы получить 1,2,5 в первом примере необходимо:
1.) Взять первый элемент из побочного массива (так как цена должна состоять всегда из одного побочного элемента);
2.) Необходимо взять первый элемент побочного массива и 3 элемент главного;
5.) Необходимо взять первый элемент побочного и два остальных главного.
-----------------------------------------------------------------------------------------------------------------------------------------------------
Надеюсь, что детально расписал задачу и всё понятно. Если что - спрашивайте.
В общем, алгоритм придумал. Расписывать его не буду. Лучше просто приложу к теме свой код, который алгоритмически идеально решает задачу. К сожалению, в задаче стоит ограничение - 1.5 с, в которое, мой алгоритм не попадает. Буду очень признателен, если вы поможете мне немного оптимизировать мой код.
-----------------------------------------------------------------------------------------------------------------------------------------------------
Pascal
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Program C;
type 
  arr = array[1..200000] of int64;
 
var
  n: int64;
  a,b: arr;
  f1,f2: text;
  
procedure sort( L, R : int64); 
var i,j,x,y: int64;
begin
  i := l; j := r;
  x := b[(l+r) div 2];
  repeat
    if (b[i] = b[j]) and (a[i] < a[j]) then swap(a[i],a[j]);
    while (b[i] < x) do inc(i);
    while (x < b[j]) do dec(j);
    if ( i <= j ) then
    begin
      if (b[i] = b[j]) and (a[i] < a[j]) then swap(a[i],a[j])
      else begin 
      swap(a[i], a[j]);
      swap(b[i], b[j]);
      inc(i); dec(j);
      end;
    end;
  until (i > j);
  if (l < j) then sort(l,j);
  if (i < r) then sort(i,r);
end;
 
function M1(a,b: arr; k: int64): int64;
var
  min: integer;
  ans: int64;
  
begin
  min := 1000000000;
  for var i := 1 to k do 
  begin
    if a[i] - b[i] < min then min := a[i] - b[i];
    ans := ans + b[i];
  end;
  M1 := ans + min;
end;
 
function M2(a,b: arr; k,n: uint64): uint64;
var
  ans: uint64;
  min: uint64;
  
begin
  min := 10000000000;
  for var i := 1 to k-1 do ans := ans + b[i];
  for var i := k to n do if a[i] < min then min := a[i];
  M2 := ans + min;
end;
 
begin
 assign(f1, 'minions.in');
 assign(f2, 'minions.out');
 reset(f1);
 rewrite(f2);
 readln(f1, n);
 for var i := 1 to n do readln(f1, a[i], b[i]);
 sort(1,n);
 for var i := 1 to n do writeln(f2, min(M1(a,b,i),M2(a,b,i,n)));
 close(f1);
 close(f2);
end.
-----------------------------------------------------------------------------------------------------------------------------------------------------
Буду рад любой помощи.

Добавлено через 5 часов 45 минут
Немного сам усовершенствовал свой код
Pascal
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Program C;
type 
  arr = array[1..200000] of int64;
 
var
  n,min1,ans: int64;
  a,b: arr;
  f1,f2: text;
  
procedure sort( L, R : int64); 
var i,j,x: int64;
begin
  i := l; j := r;
  x := b[(l+r) div 2];
  repeat
    if (b[i] = b[j]) and (a[i] < a[j]) then swap(a[i],a[j]);
    while (b[i] < x) do inc(i);
    while (x < b[j]) do dec(j);
    if ( i <= j ) then
    begin
      if (b[i] = b[j]) and (a[i] < a[j]) then swap(a[i],a[j])
      else begin 
      swap(a[i], a[j]);
      swap(b[i], b[j]);
      inc(i); dec(j);
      end;
    end;
  until (i > j);
  if (l < j) then sort(l,j);
  if (i < r) then sort(i,r);
end;
 
function M(a,b: arr; k,n: int64): int64;
var
  min2: int64;
  
begin
  ans := ans + b[k];
  min2 := 10000000000;
  for var i := k to n do if a[i] < min2 then min2 := a[i]; 
  if a[k] - b[k] < min1 then min1 := a[k]-b[k];
  M := min(ans+min1, ans-b[k]+min2);
end;
 
begin
 assign(f1, 'minions.in');
 assign(f2, 'minions.out');
 reset(f1);
 rewrite(f2);
 readln(f1, n);
 for var i := 1 to n do readln(f1, a[i], b[i]);
 sort(1,n);
 min1 := a[1]-b[1];
 for var i := 1 to n do writeln(f2, M(a,b,i,n));
 close(f1);
 close(f2);
end.
Всё-таки напишу алгоритм своего решения: сортируем элементы главного массива вместе с элементами побочного по возрастанию (я забыл упомянуть, что пары, которые даются после размерности во входном файле, считаются единым целым), при равенстве элементов главного сортируем элементы побочного по возрастанию. Затем понятно, что минимальная цена от k элементов это либо сумма всех главных элементов от 1 до k + минимальная разница элементов побочного и главного массивов от 1 до k либо сумма главных элементов от 1 до k-1 + минимальный элемент побочного от k до n.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2019, 01:02
Ответы с готовыми решениями:

Программа для решения олимпиадной задачи о поездках Васи на метро по проездному билету
Мальчик Вася каждый день ездит на метро. Утром он едет в школу, а вечером того же дня, обратно из школы, домой. Для того, чтобы немного...

Понять условие олимпиадной задачи
Задача BLOCK (25 балов) Площадью некоторого текста будем считать произведение количества его строк на длину самой длинной строки без учета...

Составление алгоритма с пояснениями к решению олимпиадной задачи (графы)
Здравствуйте всем! У меня есть к вам просьба, так как я хочу понять алгоритм этой задачи. Сам пытался, но что-то не получается у самого. ...

1
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 32
12.09.2019, 17:19  [ТС]
Сам разобрался.
Вот решение, кому интересно:
Pascal
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Program C;
type 
  arr = array[1..200000] of int64;
 
var
  n,min1,min2,m1,ind: int64;
  a,b: arr;
  f1,f2: text;
  
procedure sort( L, R : int64); 
var i,j,x: int64;
begin
  i := l; j := r;
  x := b[(l+r) div 2];
  repeat
    if (b[i] = b[j]) and (a[i] < a[j]) then swap(a[i],a[j]);
    while (b[i] < x) do inc(i);
    while (x < b[j]) do dec(j);
    if ( i <= j ) then
    begin
      if (b[i] = b[j]) and (a[i] < a[j]) then swap(a[i],a[j])
      else begin 
      swap(a[i], a[j]);
      swap(b[i], b[j]);
      inc(i); dec(j);
      end;
    end;
  until (i > j);
  if (l < j) then sort(l,j);
  if (i < r) then sort(i,r);
end;
 
begin
 assign(f1, 'minions.in');
 assign(f2, 'minions.out');
 reset(f1);
 rewrite(f2);
 readln(f1, n);
 for var i := 1 to n do readln(f1, a[i], b[i]);
 sort(1,n);
 m1 := 0;
 min1 := a[1]-b[1];
 min2 := 1000000000000000;
 for var i := 1 to n do 
 begin
   if a[i] <= min2 then
   begin
     min2 := a[i];
     ind := i;
   end;
 end;
 for var i := 1 to n do 
 begin
   if ind < i then
   begin
     min2 := 1000000000000000;
     for var j := ind+1 to n do 
     begin
       if a[j] <= min2 then
       begin
         min2 := a[j];
         ind := j;
       end;
     end;
   end;
   if a[i] - b[i] < min1 then min1 := a[i] - b[i];
   m1 := m1 + b[i];
   writeln(f2, min(m1+min1, m1-b[i]+min2));
 end;
 close(f1);
 close(f2);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2019, 17:19
Помогаю со студенческими работами здесь

Оптимизация задачи
Помогите оптимизировать программу если это возможно и может кто переписать её на другой язык программирования, чтобы это было быстрее....

Оптимизация олимпиадной задачи по программированию
Есть задача: Ограничение времени на тест: 5 сек Ограничение памяти на тест: 256 Мб Условие Дан массив целых чисел a1, a2, ...,...

Алгоритм решения олимпиадной задачи
clip2net . com/clip/m121445/1353341115-clip-71kb.jpg Дело в том, что я не знаю, как лучше считать данные. То есть прочитать всю строку, а...

Решение олимпиадной задачи (ч.2)
i:= 1 j:= 257 Цикл i:= i + x; j:= j - x; x:= x - 1 выполнили 25 раз и стало i= j. Надо найти х.

Решение олимпиадной задачи
Доброй ночи! У меня возникла проблема с онлайн проверкой задачи. ссылка на условие мое решение: #include &lt;iostream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru