С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/117: Рейтинг темы: голосов - 117, средняя оценка - 4.85
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202

Шляпа

24.06.2020, 14:22. Показов 25424. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Шляпа
Летом Максим съездил в Летнюю Какую-то Школу, где, помимо учёбы, ему очень запомнилась игра «Шляпа», в которую он вместе с друзьями играл всю смену. Опишем правила игры, которых они придерживались. Обратите внимание: эти правила немного отличаются от общепринятых.

Изначально в шляпу помещают некоторое количество бумажек с написанными на них различными словами. После этого команды из двух человек по очереди и в случайном порядке начинают отгадывать слова — один член команды объясняет другому написанное на бумажке слово, не используя однокоренные. Если партнёр отгадывает его, то команде засчитывается одно очко, слово выкидывается, а команда достаёт из шляпы новое, если у неё ещё осталось время в этом раунде. Если команда не успевает отгадать очередное слово, то бумажка на которой оно написано, возвращается в шляпу, и ход передаётся какой-то случайной команде, возможно, той же самой. Игра продолжается, пока все слова из шляпы не будут отгаданы.

Теперь Максим провёл турнир для N команд из своей школы и должен определить победителя. Он неаккуратно вёл записи игры и не отмечал, сколько слов отгадала каждая из команд, зато он записывал в хронологическом порядке каждый раз, когда какая-либо команда доставала какую-либо бумажку из шляпы. Всего таких записей M, и они следуют в хронологическом порядке. Помогите Максиму восстановить по сделанным записям, сколько слов отгадала каждая из команд.

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

В первой строке дано количество команд N и количество попыток отгадать слова M (1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000). В следующих M строках сначала указывается номер ni команды, пытавшейся отгадать слово, а через пробел дано слово wi, написанное на бумажке. Номера команд лежат в диапазоне от 1 до N. Все слова wi состоят из строчных латинских букв и имеют ненулевую длину, не превосходящую 10 букв.

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

Выведите в одну строку N чисел, i-е число должно равняться количеству слов, отгаданному i-й командой.

Примеры
Ввод
Вывод
2 3
1 hat
1 shirt
2 hat
1 1
3 2
1 mom
3 dad
1 0 1
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.06.2020, 14:22
Ответы с готовыми решениями:

Отличная шляпа
В древнем, раскинувшемся на многие мили городе Анк-Морпорке, на бархатной подушке, лежащей на полке на одном из верхних этажей Незримого...

Отличная шляпа
В древнем, раскинувшемся на многие мили городе Анк-Морпорке, на бархатной подушке, лежащей на полке на одном из верхних этажей Незримого...

Магическая шляпа
Сегодня Вася среди старых вещей нашел магическую шляпу и инструкцию по созданию шариков с её помощью. Исходно шляпа пустая. В инструкции...

13
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
24.06.2020, 17:46
В чем конкретно вопрос?
Заводите словарь для ключ - слово, значение - номер команды и проверяйте было или нет слово.
0
8 / 8 / 1
Регистрация: 25.06.2020
Сообщений: 5
25.06.2020, 23:47
Лучший ответ Сообщение было отмечено DmFat как решение

Решение

Вот друг мой, в Сириусе это решение было зачтено.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n, m = [int(i) for i in input().split()]
w = {}
for i in range(m):
    s = input().split()
    if s[1] in w.keys():
        w[s[1]] = int(s[0])
    else:
        w.update({s[1]: int(s[0])})
res = [0 for i in range(n)]
for i in w.values():
    res[i - 1] += 1
res = [str(i) for i in res]
print(" ".join(res))
6
30 / 29 / 2
Регистрация: 27.06.2020
Сообщений: 14
27.06.2020, 12:38
Python
1
2
3
4
5
6
7
8
9
n, m = list(map(int, input().split()))
word = {}
scores = [0] *n
for _ in range(m):
    t, w = input().split()
    word[w] = t
for key in word:
    scores[int(word[key]) - 1] += 1
print(*scores)
0
Заблокирован
27.06.2020, 13:17
Уважаемый Alestrange, не могли бы Вы, пожалуйста объяснить, зачем использовать метод update к ассоциативному массиву:
Цитата Сообщение от Alestrange Посмотреть сообщение
w.update({s[1]: int(s[0])})
По-моему, можно обойтись без условия
Цитата Сообщение от Alestrange Посмотреть сообщение
if s[1] in w.keys():
w[s[1]] = int(s[0])
else:
w.update({s[1]: int(s[0])})
- просто написать вместо этого
Python
1
w[s[1]] = int(s[0])
Мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n, m = map(int, input().split())
words = {}
for i in range(m):
    a = input().split()
    number, word = int(a[0]), a[1]
    if word in words.keys():
        words[word] = number
    else:
        words[word] = number
ans = [0 for i in range(n)]
for i in words.values():
    ans[i - 1] += 1
print(" ".join(list(map(str, ans))))
Добавлено через 10 минут
Или так:
Python
1
2
3
4
5
6
7
8
9
10
n, m = map(int, input().split())
words = {}
for i in range(m):
    a = input().split()
    number, word = int(a[0]), a[1]
    words[word] = number
ans = [0 for i in range(n)]
for i in words.values():
    ans[i - 1] += 1
print(" ".join(list(map(str, ans))))
Забыл if убрать!
0
14 / 14 / 0
Регистрация: 03.04.2020
Сообщений: 16
28.06.2020, 10:53
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n, m = map(int, input().split(' '))
team = dict()
words = dict()
 
for i in range(m):
    a = input().split(' ')
    if a[1] in words:
        team[words[a[1]]] -= 1
        words[a[1]] = int(a[0])
        team[int(a[0])] = team.get(int(a[0]), 0) + 1
    else:
        words[a[1]] = int(a[0])
        team[int(a[0])] = team.get(int(a[0]), 0) + 1
t = ''
for i in range(n):
    t += str(team.get(i + 1, 0)) + ' '
print(t[:-1])
0
3 / 3 / 0
Регистрация: 11.09.2020
Сообщений: 5
11.09.2020, 21:34
Решение на c++

C++
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
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
 
void solve(){
    ll n, m;
    cin>>n>>m;
    map<string,ll> mp;
    map<ll,ll> rating;
    for(int i = 1;i <= n;i++){
        rating[i] = 1;
    }
    for(ll i = 0;i < m;i++){
        ll team;
        string word;
        cin>>team>>word;
        if(mp[word] != 0){
                ll team_2 = mp[word];
                rating[team_2]--;
                mp[word] = team;
                rating[team]++;
        }else{
            rating[team]++;
            mp[word] = team;
        }
    }
 
    ll temp = 0;
    ll team_ans = 0;
    for(auto it = rating.begin();it != rating.end();it++){
            cout<<it->second - 1<<" ";
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    //cin>>t;
    //while(t--)
    solve();
    return 0;
}
3
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
12.09.2020, 08:49
Ktd1231, зачем решение на плюсах в разделе питона?
2
8 / 7 / 1
Регистрация: 27.10.2021
Сообщений: 14
04.08.2022, 00:12
C++
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <string>
#include <deque>
using namespace std;
typedef long long ll;
 
int main() {
    int n, m;
    cin >> n >> m;
    map<int, int> team_cnt;
    map<string, int> cnt_words_last_team;
    for (int i = 0; i < m; ++i) {
        int team_num; string word;
        cin >> team_num >> word;
        if (cnt_words_last_team.find(word) != cnt_words_last_team.end()) {
            team_cnt[cnt_words_last_team[word]] -= 1;
        }
        cnt_words_last_team[word] = team_num;
        team_cnt[team_num] += 1;
    }
    for (int i = 1; i < n + 1; ++i) {
        cout << team_cnt[i] << " ";
    }
}
Вот попроще. Правда решение на плюсах в разделе питона по данной задаче действительно не целесообразно, так как проверка на содержание элемента в ассоциативном массиве в c++ занимает O(log n) времени, а в питоне O(n).
1
10 / 10 / 0
Регистрация: 05.04.2023
Сообщений: 47
01.05.2024, 16:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Online C++ compiler to run C++ program online
#include <bits/stdc++.h>
using namespace std;
int main(){ 
    int n,m,cnt; 
    string s;
    cin >> n >> m;
    map< string , int> dict;
    vector < int > ans(n,0);
    for(int i = 0; i < m; i++) {
        cin >> cnt >> s;
        dict[s] = cnt; 
    }
    for (auto& item : dict)
        ans[item.second - 1]++;
    for(int i = 0; i < n; i++) 
        cout << ans[i] <<' '; 
}
c++
0
0 / 0 / 0
Регистрация: 02.05.2024
Сообщений: 1
02.05.2024, 23:15
это какие курсы надо пройти, чтобы такого рода задачи решать?

Добавлено через 1 минуту
Alestrange, какой материал вы изучили? интересно, что надо пройти для решения таких задач?
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
03.05.2024, 02:25
Цитата Сообщение от Ilya_Av Посмотреть сообщение
Alestrange, какой материал вы изучили? интересно, что надо пройти для решения таких задач?
)) Он с 22-го года не заходит.
Цитата Сообщение от Ilya_Av Посмотреть сообщение
это какие курсы надо пройти, чтобы такого рода задачи решать?
Словарей достаточно:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from collections import Counter
 
team_of_word = Counter()
res_of_team = Counter()
n,m = map(int, input('n, m->').split())
for _ in range(m):
    team_num_s, word = input('номер команды, слово->').split()
    team_num = int(team_num_s)
    old_team_num = team_of_word[word]
    team_of_word[word] = team_num
    res_of_team[old_team_num] -= 1
    res_of_team[team_num] += 1
 
print(res_of_team)
for i in range(n):
    print(res_of_team[i+1], end=' ')
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
03.05.2024, 09:25
Пардон, отладочную строчку 14 забыл убрать. Вот так нужно:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from collections import Counter
 
team_of_word = Counter()
res_of_team = Counter()
n, m = map(int, input('n, m->').split())
for _ in range(m):
    team_num_s, word = input('номер команды, слово->').split()
    team_num = int(team_num_s)
    old_team_num = team_of_word[word]
    team_of_word[word] = team_num
    res_of_team[old_team_num] -= 1
    res_of_team[team_num] += 1
 
for i in range(n):
    print(res_of_team[i + 1], end=' ')
0
0 / 0 / 0
Регистрация: 11.08.2025
Сообщений: 7
23.08.2025, 16:15
куча лишних действий у тебя
вот оптимизированный код:
Python
1
2
3
4
5
6
7
8
9
n, m = map(int,input().split())
name_num = {}
for i in range(m):
    s = input().split()
    name_num[s[1]] = int(s[0])
res = [0] * n
for i in name_num.values():
    res[i - 1] += 1
print(*res)
на сириусе прошел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2025, 16:15
Помогаю со студенческими работами здесь

Шляпа
Летом Максим съездил в Летнюю Какую-то Школу, где, помимо учёбы, ему очень запомнилась игра «Шляпа», в которую он вместе с друзьями играл...

Сложная векторная шляпа
Даны 3 точки: А ( 3 , 0, 5 ) В ( -1, 7, 4 ) С ( 0, 2, -3 ) Вектора АВ, ВС, АС образуют треугольник. Задача: выразить через эти...

Мексиканская шляпа вейвлет преобразование
Добрый день! Может быть у кого-нибудь есть пример реализации системы для атмосферных вычислений (температура , давление). Нужно на пайтоне...

Какая-то шляпа при подключении FFMPEG к VS 2017
Какая-та шляпа при подключение FFMPEG к VS 2017 Скачали библиотеку с оф сайта распаковал на c:\ подключил в студии хэдеры, либы и вот...

Эта шляпа ничего не выводит на консоль( Что я сделал не так?
public class Main { public static void main(String args) { int mass = new int ; for(int i = 0; i&gt;5; i++){...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru