1

(3 відповідей, залишених у Python)

Щиро дякую, проходить всі тести. ))
В назві теми "Розробити класс Student - Не проходять 2 тести з 10 (Python 2.7.16)"  я написав, що використовую Python 2. ))

Всім гарного настрою!

Завдання:

Розробити класс Student для представлення відомостей про успішність слухача курсу Prometheus. Об'єкт класу має містити поля для збереження імені студента та балів, отриманих ним за виконання практичних завдань і фінального екзамена.

Забезпечити наступні методи класу:

конструктор, який приймає рядок -- ім'я студента -- та словник, що містить налаштування курсу у наступному форматі:
conf = {
'exam_max': 30, # кількість балів, доступна за здачу екзамена
'lab_max': 7, # кількість балів, доступна за виконання 1 практичної роботи
'lab_num': 10, # кількість практичних робіт в курсі
'k': 0.61, # частка балів від максимума, яку необхідно набрати для отримання сертифікату
}.
метод make_lab(m,n), який приймає 2 аргументи та повертає посилання на поточний об'єкт. Тут m -- кількість балів набрана за виконання завдання (ціле або дійсне число), а n -- ціле невід'ємне число, порядковий номер завдання (лаби нумеруються від 0 до lab_num-1). При повторній здачі завдання зараховується остання оцінка. Якщо n не задане, мається на увазі здача першого невиконаного практичного завдання. Врахувати, що під час тестування система іноді дає збої, тому за виконання завдання може бути нараховано більше балів ніж це можливо за правилами курсу, що не повинно впливати на рейтинг студента. Крім того в системі можуть міститися додаткові завдання, чиї номери виходять за межі 0..lab_num -- звичайно, бали за них не повинні зараховуватися для отримання сертифікату.
метод make_exam(m), який приймає 1 аргумент -- ціле або дійсне число, оцінку за фінальний екзамен, та повертає посилання на поточний об'єкт. Як і у випадку з практичними завданнями, оцінка за екзамен в результаті помилки іноді може перевищувати максимально допустиму.
метод is_certified(), який повертає тьюпл, що містить дійсне число (суму балів студента за проходження курсу), та логічне значення True або False в залежності від того, чи достатньо цих балів для отримання сертифікату.
Так як курс є доступним онлайн і не має дедлайнів на здачу робіт, студент може виконувати роботи в довільному порядку. Вважати, що кількість спроб на виконання кожного з завдань необмежена.

Приклад послідовності дій для тестування класу:
conf = {
'exam_max': 30,
'lab_max': 7,
'lab_num': 10,
'k': 0.61,
}
oleg = Student('Oleg', conf)
oleg.make_lab(1) \ # labs: 1 0 0 0 0 0 0 0 0 0, exam: 0
.make_lab(8,0) \ # labs: 7 0 0 0 0 0 0 0 0 0, exam: 0
.make_lab(1) \ # labs: 7 1 0 0 0 0 0 0 0 0, exam: 0
.make_lab(10,7) \ # labs: 7 1 0 0 0 0 0 7 0 0, exam: 0
.make_lab(4,1) \ # labs: 7 4 0 0 0 0 0 7 0 0, exam: 0
.make_lab(5) \ # labs: 7 4 5 0 0 0 0 7 0 0, exam: 0
.make_lab(6.5) \ # labs: 7 4 5 6.5 0 0 0 7 0 0, exam: 0
.make_exam(32) # labs: 7 4 5 6.5 0 0 0 7 0 0, exam: 30
print oleg.is_certified() # (59.5, False)
oleg.make_lab(7,1) # labs: 7 7 5 6.5 0 0 0 7 0 0, exam: 30
print oleg.is_certified() # (62.5, True)

Код з тестами:

class Student(object):
    def __init__(self, name, conf):
        self.name = name
        self.conf = conf
        self.labs = [0] * self.conf.get('lab_num')
        self.exam = 0.0

    def make_lab(self, m, n=-1):

        if n >= self.conf.get('lab_num'):
            return self

        if n == -1:
            try:
                n = self.labs.index(0)
            except:
                return self

        if m > self.conf.get('lab_max'):
            m = self.conf.get('lab_max')

        self.labs[n] = m 
        #print(self.labs)

        return self


    def make_exam(self, m):
        if m > self.conf.get('exam_max'):
            m = self.conf.get('exam_max')
        self.exam = m
        return self

    def is_certified(self):
        smarks = sum(self.labs) + self.exam
        
        if smarks/100 >= self.conf.get('k'):
            is_cert = True
        elif smarks/100 < self.conf.get('k'):
            is_cert = False
        return (smarks, is_cert)








conf1 = {'exam_max': 20,'lab_max': 40,'lab_num': 2,'k': 0.75}
o1 = Student('Oleg', conf1)
print o1.is_certified(), '(0, False)'
o2 = Student('Oleg', conf1)
o2.make_lab(60).make_lab(35.2)
print o2.is_certified(), '(75.2, True)'
o3 = Student('Oleg', conf1)
o3.make_lab(10).make_lab(10).make_exam(15)
print o3.is_certified(), '(35, False)'
o3.make_lab(20,1).make_lab(20,0)
print o3.is_certified(), '(55, False)'
o3.make_lab(50,2)
print o3.is_certified(), '(55, False)'
o3.make_lab(40,1)
print o3.is_certified(), '(75, True)'
conf2 = {'exam_max': 52,'lab_max': 8,'lab_num': 6,'k': 0.5}
o4 = Student('Oleg', conf2)
o4.make_exam(100)
print o4.is_certified(), '(52, True)'
o5 = Student('Oleg', conf2)
o5.make_lab(40).make_lab(7,5).make_lab(1).make_lab(7).make_lab(7).make_lab(7).make_lab(7,1)
print o5.is_certified(), '(43, False)'
o5.make_lab(7)
print o5.is_certified(), '(43, False)'
o5.make_exam(7)
conf3 = {'exam_max': 10,'lab_max': 1,'lab_num': 90,'k': 0.5,}
o6 = Student('Oleg', conf3)
for i in range(51): o6.make_lab(1)
print o6.is_certified(), '(51, True)'

Для виклику o3.is_certified() В мене: (75, False) Треба: (75, True)
Для виклику o4.is_certified() В мене: (52, False) Треба: (52, True)

Допоможіть будь-ласка знайти помилку в коді?

koala, прошу вибачення, я не спеціально.

Вхідні дані
4 5
1 2
2 3
1 3
4 2
4 3
Вихідні дані
1 4

#include <iostream>
using namespace std;
int main()
{
    long long M, N, i, u, v;
    cin >> N >> M;
    signed char **matrix = new signed char*[N];
    for (i = 0; i < N; ++i)
    {
        matrix[i] = new signed char[M];
        for (u = 0; u < M; ++u) matrix[i][u] = 0;
    }
    for (i = 0; i < M; ++i)
    {
        cin >> u >> v;
        matrix[u - 1][i] = 1;
        matrix[v - 1][i] = -1;
    }
    for (i = 0; i < N; ++i)
    {
        for (u = 0; u < M; ++u)
            if (matrix[i][u]==-1) break;
        if (u==M) {cout<<i+1<<" ";}
    }
    cout << endl;
    return 0;
}

Тай завдання я вже виконав сам, тільки по часу не проходять всі тести.

Головне в кожному завданні правильно перейти від преамбули до суті завдання. Якщо правильно сформулювати завдання на мові графів, то тоді буде очевидно, які алгоритми теорії графів використовувати.

Всього в чемпіонаті є n гравців. Для деяких пар гравців відомо хто з них може виграти в іншого. Гравець називається незручним, якщо не існує такого гравця, який точно може перемогти його. Тренер Баріка вирішив знайти всіх незручних для Баріка гравців. Виведіть їх у порядку не спадання номерів.
Вхідні дані
В першому рядку вхідного файлу містяться 2 цілі числа n і m — кількість гравців, і кількість пар гравців, для яких відомо, хто з них кого може перемогти. В наступних m рядках містяться по 2 цілі числа u i v в кожному (1≤u,v≤n,u≠v), що означають, що гравець u може перемогти гравця v.
Вихідні дані
Виведіть в єдиному рядку номери всіх незручних гравців у порядку неспадання.
Приклад
Вхідні дані
4 5
1 2
2 3
1 3
4 2
4 3
Вихідні дані
1 4

Так, ви праві, вам це не потрібно. А нам задали таке завдання по темі графи. Хоча цей алгоритм і не на графи, я гадаю, що він може не пройти всі тести по часу (Time-limit <0.250).

Можете допомогти за алгоритмом написати код програми?

Алгоритм:

Прихований текст

1. Зробити двовимірний динамічний масив і ввести в нього дані.
2. Знайти в масиві стартовий елемент, що містить 1 (це можна зробити ще при читанні даних).
3. Обчислити кількість елементів масиву (кількість рядків * кількість стовпців).
4. Зробити стартовий елемент поточним (координати: рядок, стовпець).
5. Заводимо лічильник маршруту і ініціалізуємо його 1.
6. У циклі:
- Перевіряємо сусідні чотири елементи (з урахуванням меж масиву) на значення на одиницю більше, ніж значення поточного елемента. Якщо таких елементів більше одного, значить вхідні дані некоректні - відразу NO і вихід з циклу. Якщо таких елементів немає, перевіряємо лічильник маршруту. Якщо його значення дорівнює кількості елементів масиву - ми в кінцевій точці - YES і вихід з циклу, інакше - NO і вихід з циклу.
- Є єдиний елемент, значення якого більше поточного на 1. Робимо його поточним.
- Збільшуємо лічильник маршруту.
7. Після виходу з циклу звільняємо пам'ять, виділену під двовимірний динамічний масив.

Умова:

Прихований текст

Задано прямокутне поле n×m, в одній із клітинок в момент часу 1 з'являється турист. Кожну секунду він переходить в
одну із 4-х сусідніх клітинок, в якій він ще не був, а при переході в нову клітинку девайс туриста старанно відсилає вам номер секунди, на якій він опинився в клітинці. Турист ніколи надовго не затримується, а після переходу миттєво обирає наступну точку, і за одну секунду опиняється в ній. Після того, як турист обходив все поле, data - центр зібрав для вас всю інформацію у вигляді таблиці a розміром n×m, де aij — час, коли турист тут з'явився. Потрібно визначити, чи існує такий маршрут, що обходить всю таблицю, обходить всі клітинки по одному разу і для кожної клітинки робить це в момент часу aij.

Вхідні дані:
В першому рядку вхідного файлу міститься два цілих числа n, m (1≤n,m≤1000) - розміри
таблиці. В наступних n рядках міститься по m цілих чисел в кожному рядку aij (1≤aij≤10^6)
— моменти часу, в які потрібно з'являтися в клітинці.

Вихідні дані:
Виведіть «YES», якщо існує такий маршрут, і «NO», якщо не існує.

Вхідні дані
3 3
1 2 3
6 5 4
7 8 9
Вихідні дані
YES

Вхідні дані
2 2
1 2
3 4
Вихідні дані
NO

Спроба написати код:

Прихований текст
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n,m,start_i,start_j;
    cin>>n>>m;
    vector<vector<int> > g(n, vector<int> (m) );
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            cin>>g[i][j]; if (g[i][j]==1) {start_i=i;start_j=j;}
        }
    int k_nm=n*m;
    int start_g=g[start_i][start_j];
    int counter=1;

//???

return 0;
}

11

(0 відповідей, залишених у C++)

В готель приїхали учні на літню школу. Кожен для себе заздалегідь вибрав, в яку кімнату він хоче заселитися. Якщо обрана кімната виявляється вільна, то учень займає її, в іншому випадку він займає першу вільну кімнату з великим номером. Крім того, деякі учні їдуть в середині школи. Відразу після від'їзду учня його кімната стає доступна для заселення наступного. Так само, іноді адміністрація готелю бажає знати, скільки всього сумарно учнів проживає у цій кімнаті і у всіх кімнатах з номерами менше заданого.

Формат вхідних даних
Перший рядок містить натуральне число n - кількість запитів до готелю, що відбуваються протягом всієї школи (n ? 2*10^5). Наступні n рядків містять інформацію про запити. Запити бувають 3 типів:
+ x, це означає, що приїхав учень, який бажає зайняти кімнату номер x(x ? 2*10^5):
– x, це означає, що з кімнати номер x поїхав учень . (Гарантується, що ця кімната не була порожня).
? x, це означає, що адміністрація хоче дізнатися скільки всього сумарно проживає учнів з номерами кімнат не перевищують x.

Формат вихідних даних
Для кожного приїжджого учня виведіть номер кімнати, в яку він оселиться, або для запиту адміністрації виведіть кількість проживаючих.

Прихований текст

Ввід
12
+ 5
? 5
+ 5
? 5
+ 5
? 7
- 6
? 6
+ 5
? 25
+ 5
? 7

Вивід
5
1
6
1
7
3
1
6
3
8
3

Прихований текст
//Завдання на дерево відрізків
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#define MAX 200002
using namespace std;
//int SegTree[4*MAX];
int a[MAX];
vector<vector<int> > SegTree;
void build(int Vertex, int LeftPos, int RightPos)
{
    if (LeftPos == RightPos) SegTree[Vertex].push_back(a[LeftPos]);
    else
    {
    long long Middle = (LeftPos + RightPos) / 2;
    build (2*Vertex, LeftPos, Middle);
    build (2*Vertex+1, Middle+1, RightPos);
    SegTree[Vertex].resize(RightPos - LeftPos + 1);
    merge(SegTree[2*Vertex].begin(),SegTree[2*Vertex].end(),
          SegTree[2*Vertex+1].begin(),SegTree[2*Vertex+1].end(),
          SegTree[Vertex].begin());
  }
}
void update(int Vertex, int LeftPos, int RightPos, int Position, int NewValue)
{
    if (LeftPos == RightPos)
        //SegTree[Vertex] = NewValue;
        SegTree[Vertex].push_back(NewValue);
    else
    {
    int Middle = (LeftPos + RightPos) / 2;
    if (Position <= Middle) update (2*Vertex, LeftPos, Middle, Position, NewValue);
    else update (2*Vertex+1, Middle+1, RightPos, Position, NewValue);
    //SegTree[Vertex] = SegTree[2*Vertex] + SegTree[2*Vertex+1];
    merge(SegTree[2*Vertex].begin(),SegTree[2*Vertex].end(),
          SegTree[2*Vertex+1].begin(),SegTree[2*Vertex+1].end(),
          SegTree[Vertex].begin());
  }
}
int Query(int Vertex, int LeftPos, int RightPos, int Left, int Right, int x)
{
    if (Left > Right) return 0;
    if ((LeftPos == Left) && (RightPos == Right))
    return lower_bound(SegTree[Vertex].begin(),
                       SegTree[Vertex].end(),x) - SegTree[Vertex].begin();
    int Middle = (LeftPos + RightPos) / 2;
    return Query(2*Vertex, LeftPos, Middle, Left, min(Middle,Right), x) +
    Query(2*Vertex+1, Middle+1, RightPos, max(Left,Middle+1), Right, x);
}

/*
int Summa(int Vertex, int LeftPos, int RightPos, int Left, int Right)
{
    if (Left > Right) return 0;
    if ((Left == LeftPos) && (Right == RightPos)) return SegTree[Vertex];
    int Middle = (LeftPos + RightPos) / 2;
    return Summa(2*Vertex, LeftPos, Middle, Left, min(Right,Middle)) +
         Summa(2*Vertex+1, Middle+1, RightPos, max(Left,Middle+1), Right);
}
*/

int i, l, r, x, n;
char cmd;
int main ()
{
    //memset(SegTree,0,sizeof(SegTree));
    cin >> n;
    SegTree.resize(4*n);
    build(1,1,n);
    for(i = 1; i <= n; i++)
    {
        cin>>cmd;
        if (cmd == '+') {cin >> x; update(1,1,n,x,1);}
        else if (cmd == '?') {cin >> x; cout << Query(1,1,n,1,n,x) << endl;}
        else if (cmd == '-') {cin >> x; update(1,1,n,x,0);}
    }
  return 0;
}

Тести проходить

Проходить тільки перший тест, а два останніх - ні.

Бачу використовуєте компаратор (вказівник на функцію) для сортування зі встроєною функцією:
sort(vect.begin(),vect.end(), [](auto x, auto y){return x.first*y.second < y.first*x.second;});
[] - це називається лямбда-вираз - встроєна безіменна локальна функція, у вигляді якої записаний компаратор сортування?
Цікаво, а як правильно записати цей компаратор для сортування через окрему функцію?
Наприклад:

bool Fab(const int a, const int b)
{
    return a > b;
}
...
int a[10];
sort(a, a + 10, Fab);

Тему закрито - помилка в тестах.
(Тему можна видалити).

Пiд час порабування магазину злодiй виявив N ящичкiв iз золотим пiском. У ящичку пiд номером i пiсок має вартiсть Vi i вагу Wi. Щоб винести награбоване, злодiй використовує рюкзак. Потрiбно визначити найбiльшу сумарну вартiсть пiска, який може винести грабiжник, якщо вантажомiсткiсть рюкзака обмежена величиною W. Iз ящичкiв можна пересипати довiльну кiлькiсть пiска, тодi вiдношення вартостi вiдсипаного пiска до вартостi усього ящика буде дорiвнювати вiдношенню об’єма вiдсипаного пiска до об’єма
усього ящика.
Не проходить всі тести:

Прихований текст

====== Test =======
--- Input: size 14 ---
1 1000
500 30

--- Output: size 20 ---
500.000000000000057

--- Correct: size 20 ---
500.000000000000000

--- Stderr: size 0 ---

--- Checker output: size 77 ---
Line 1 differs: output:
>500.000000000000057<
correct:
>500.000000000000000<

Прихований текст

====== Test  =======
--- Input: size 12 ---
1 10
500 30

--- Output: size 20 ---
166.666666666666686

--- Correct: size 20 ---
166.666666666667000

--- Stderr: size 0 ---

--- Checker output: size 77 ---
Line 1 differs: output:
>166.666666666666686<
correct:
>166.666666666667000<


Прихований текст

====== Test #6 =======
--- Input: size 57 ---
5 9022
1717 8427
2852 6912
5375 8940
3316 1601
3336 9926

--- Output: size 21 ---
7777.730984340044415

--- Correct: size 21 ---
7777.730984340040000

--- Stderr: size 0 ---

--- Checker output: size 79 ---
Line 1 differs: output:
>7777.730984340044415<
correct:
>7777.730984340040000<

Програма:

Прихований текст
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
vector<pair<double, double>> vect;
int main()
{
    int i,n;
    double w,vi,wi,res;
    cin>>n>>w;
    for(i=0; i<n; i++)
    {
        cin>>vi>>wi;
        vect.push_back(make_pair(vi/wi, wi));
    }
    sort(vect.begin(),vect.end());
    reverse(vect.begin(),vect.end());
    for(i=0; i<vect.size(); i++)
    {
        res += min(w, vect[i].second)*vect[i].first;
        w -= min(w, vect[i].second);
    }
    cout<<fixed<<setprecision(15)<<res<<endl;
    return 0;
}

Дякую! )

Поясніть будь-ласка різницю між статичним та динамічним виділенням пам'яті для масиву конкретно з 10 елементів (тобто кількість елементів наперед вже відома):
1) int *a = new int[10];
2) int a[10];

"*" вказівник, "a" - ім'я масиву, "int" - тип , "new"  - виділення пам'яті.

17

(9 відповідей, залишених у C++)

Хоча в Python набагато менший і красивіший код, але, якщо я не помиляюсь, програми на Python працюють трішки повільніше ніж на С++ і тому на олімпіадах ліміт часу на програми в Python трішки збільшують.

18

(9 відповідей, залишених у C++)

koala, дякую))

19

(7 відповідей, залишених у C++)

koala, дякую))

20

(9 відповідей, залишених у C++)

Найпростіше - створити двовимірний масив 50 на 50 і заповнити його з менших значень до більших, а потім брати звідти дані.

А як тоді вираховувати ці значення?