Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64

Решение задачи по раздаче карт с числами

25.07.2016, 08:11. Показов 8510. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В колоде карт есть n карт (n — чётное число). На каждой карте написано целое положительное число. В новую карточную игру будут играть n / 2 человек. Каждому из игроков перед началом игры будет роздано ровно по две карты, причём каждая карта из колоды будет роздана ровно одному игроку.

Перед вами стоит задача найти такой способ раздачи карт, чтобы у каждого из игроков сумма чисел, написанных на полученных им картах, совпадала. Гарантируется, что входные данные таковы, что это всегда возможно.
Входные данные
В первой строке входных данных записано целое положительное число n (2 ≤ n ≤ 100) — количество карт. Гарантируется, что n чётно.

Во второй строке следует последовательность из n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 100), где ai равно числу, написанному на i-й карте
Выходные данные
Выведите n / 2 пар целых чисел, по одной паре в строке — номера карт, которые нужно отдать каждому игроку. Каждая карта должна быть роздана ровно одному игроку. Карты нумеруются в том же порядке, в котором описываются во входных данных, начиная с единицы. Гарантируется, что входные данные таковы, что ответ всегда существует. Если возможных правильных ответов несколько, разрешается вывести любой из них.
Миниатюры
Решение задачи по раздаче карт с числами  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2016, 08:11
Ответы с готовыми решениями:

Решение задачи с квадратными числами
Добрый день! Помогите решить задачу с ресурса codewars. Смысл задачи: Учитывая целое число, определите, является ли оно квадратным...

Колода карт из 36 карт, сколькими способами можно достать 5 карт?
Колода карт из 36 карт. Сколькими способами можно достать 5 карт так, чтобы среди них были пиковые карты?

Из колоды карт (36 карт) наудачу берут пять карт
Здравствуйте! С теорией вероятностей всегда имел проблему, не могу никак сообразить. Задание такое: Из колоды карт (36 карт) наудачу...

23
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
25.07.2016, 08:17  [ТС]
Мой код:
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
using System;
class Sharp {
static void Main() {
    int n;
    int sum=0;
    int[] mas = new int[101];
    n = Convert.ToInt32(Console.ReadLine());
    for(int k=0;k<n;k++)
    {
        mas[k] = Convert.ToInt32(Console.ReadLine());
        sum = sum + mas[k];
    }
    int m;
    sum = sum / (n / 2);
    for(int j=0;j<n-1;j++)
    {
        for(int k=j+1;k<n;j++)
        {
            
            if (((int)(mas[j]) + mas[k]) == sum)
                Console.WriteLine((j+1)+" "+(k+1));
        }
    }
    Console.ReadKey();
}
}
Он компилируется ,но позже при запуске выдаёт ошибку.
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
25.07.2016, 10:22
Решение, мягко говоря, неверное.
Во-первых, в условии сказано, что числа на картах подаются на вход программе во второй строке (все сразу), а вы считываете их построчно.
Во-вторых, ваша проверка и поиск пары нарушает ещё одно условие задачи: каждая карта может быть выдана только одному игроку.

O(n2) решение:
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
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Linq;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Карточная игра. Нажмите 'enter' для продолжения.");
            Console.ReadLine();
 
            while (true)
            {
                int count = ReadCount();
                if (count < 0) continue;
 
                int[] deck = ReadDeck(count);
                if (deck == null) continue;
 
                PrintPairs(deck);
 
                break;
            }
            Console.WriteLine("Готово");
            Console.ReadLine();
        }
 
        static int ReadCount()
        {
            Console.Write("Введите количество карт: ");
 
            int count = -1;
            Int32.TryParse(Console.ReadLine(), out count);
            if (count % 2 != 0) count = -1;
            return count;
        }
 
        static int[] ReadDeck(int count)
        {
            Console.Write("Введите карты, разделённые пробелами: ");
 
            string[] tokents = Console.ReadLine().Split(' ');
            if (tokents.Length != count) return null;
 
            int[] deck = new int[tokents.Length];
            for(int i = 0; i < tokents.Length; i++)
            {
                int value = 0;
                if (!int.TryParse(tokents[i], out value)) return null;
                deck[i] = value;
            }
            return deck;
        }
 
        static void PrintPairs(int[] deck)
        {
            int players = deck.Length / 2;
            int summ = deck.Sum();
            int onHands = summ / players;
 
            int pair = 0;
            int[] taken = new int[deck.Length];
            for(int i = 0; i < deck.Length; i++)
            {
                if(taken[i] == 0)
                {
                    pair = deck[i];
                    taken[i] = 1;
                    for(int j = 1; j < deck.Length; j++)
                    {
                        if(taken[j] == 0)
                        {
                            if(pair + deck[j] == onHands)
                            {
                                taken[j] = 1;
                                Console.WriteLine("{0} + {1} = {2}", pair, deck[j], pair + deck[j]);
                                pair = 0;
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.07.2016, 12:18
O(2n):
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
int n = int.Parse(Console.ReadLine());
int[] numbers = Console.ReadLine().Split(' ').Select(int.Parse).Take(n).ToArray();
 
var map = new Dictionary<int, Queue<int>>(n);
int min = numbers[0], max = numbers[0];
for (int i = 0; i < numbers.Length; i++)
{
    min = Math.Min(numbers[i], min);
    max = Math.Max(numbers[i], max);
 
    Queue<int> queue;
    if (!map.TryGetValue(numbers[i], out queue))
        map.Add(numbers[i], queue = new Queue<int>());
    queue.Enqueue(i + 1);
}
 
int sum = min + max;
foreach (var entry in map)
{
    var key = entry.Key;
    var a = entry.Value;
    var b = map[sum - key];
 
    while (a.Count > 0)
        WriteLine(a.Dequeue() + " " + b.Dequeue());
}
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
25.07.2016, 21:46
Ээээ.... Тут вашу задачку в другом разделе выложили, поэтому и вышел на эту тему. Смотрю, у вас тут все круто - словари, вложенные циклы... Я то по-простому решил, не так круто как вы, в одну строчку: индексируем, сортируем по значению карт с сохранением индексов и набираем пары индексов с краев
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
26.07.2016, 09:05
kolorotur, хоть убей не понимаю математики происходящего. Хоть и не студент вроде.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.07.2016, 09:45
Цитата Сообщение от _Ivana Посмотреть сообщение
Тут вашу задачку в другом разделе выложили
Где?

Цитата Сообщение от _Ivana Посмотреть сообщение
Я то по-простому решил, не так круто как вы, в одну строчку
Скромнее надо быть

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

Exerion, единственная математика там — это нахождение требуемой суммы карт через минимальное и максимальное значение, что является откровенной тупостью (хоть и работает). Варианты выше (ваш и ТС) с обычным делением на количество игроков — намного лучше и красивее.
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
26.07.2016, 16:57  [ТС]
Exerion, Да, мой код не совершенен ,так как имею мало опыта в C# . За решение спасибо тебе и всем кто отписался . Задачу решил на C++
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.07.2016, 17:02
Цитата Сообщение от netrox Посмотреть сообщение
Задачу решил на C++
Кодом не поделитесь?
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
26.07.2016, 17:05  [ТС]
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
47
48
49
50
51
52
53
54
55
56
#include"iostream"
using namespace std;
int main()
{
    int n;
    int sum = 0;
    int mas[100];
    cin >> n;
    for (int k = 0; k < n; k++)
    {
        cin>>mas[k];
        sum = sum + mas[k];
    }
    int i = 0;
    int mas2[100];
    sum = sum / (n / 2);
    for (int j = 0; j < n - 1; j++)
    {
        for (int k = j + 1; k < n; k++)
        {
            if ((mas[j] + mas[k]) == sum)
            {
                mas2[i] = j + 1;
                ++i;
                mas2[i] = k + 1;
                ++i;
            }
        }
    }
    sum=0;
    for (int j = 2; j < i; j++)
    {
        for (int k = j - 1; k >= 0; k--)
        {
            if (mas2[j] == mas2[k])
            {
                mas2[j] = 0;
            }
        }
    }
    for (int k = 0; k < i ; k++)
    {
         
         if(mas2[k]!=0)
        {
            cout << mas2[k]<<" ";
            ++sum;
        
        }   
        if(sum==2)
        {
            cout<<endl;
            sum=0;
        }
    }
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
26.07.2016, 18:30
Цитата Сообщение от kolorotur Посмотреть сообщение
Код-то покажите.
Haskell
1
f l = (\(a,b) -> zip a $ reverse b) . splitAt (length l `div` 2) . map snd . sort . zip l $ [1..]
Цитата Сообщение от kolorotur Посмотреть сообщение
или дайте ссылку на ту, другую тему, где вы код выложили
Раздать по две карты с равной суммой
2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.07.2016, 18:33
_Ivana, Хаскель — он такой, да.
К сожалению, с языком не настолько знаком, чтобы что-то сказать об эффективности используемого алгоритма. Но выглядит красиво!
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
26.07.2016, 18:40
kolorotur, алгоритм я же описал в паре строк выше:
Цитата Сообщение от _Ivana Посмотреть сообщение
индексируем, сортируем по значению карт с сохранением индексов и набираем пары индексов с краев
которую вы же процитировали. Сортировка - O(n*log(n)), остальное - зависит от языка и предоставляемых им коллекций. В Haskell сделал на списках, за счет этого якобы "лишние" проходы, но оптимизирующий компилятор знает о чистоте всех функций и отлично умеет фьюзить несколько последовательных проходов в один. А на императивном языке - еще проще: формируем массив (вектор или что там еще у вас бывает) пар - первый элемент каждой пары - достоинство карты, второй - индекс карты в исходном массиве. Сортируем этот контейнер пар лексикографически (т.е. обычно ) - получаем сортированные достоинства карт с сохранением их первоначальных индексов. Если доступ к любому элементу контейнера за О(1) - то просто берем 2 указателя (индекса) - на начало и на конец - выводим соответствующие им индексы карт (вторые элементы пар), потом начальный указатель увеличиваем а конечный уменьшаем и снова выводим, пока начальный меньше конечного. Это я совсем в мелочах расписал алгоритм.
0
50 / 37 / 9
Регистрация: 25.06.2014
Сообщений: 406
26.07.2016, 19:59
Код на C# по алгоритму, который написал _Ivana.
C#
1
2
3
4
5
6
7
8
int count = int.Parse(Console.ReadLine());
var cards = Console.ReadLine().Split(' ')
                   .Select((itm, indx) => new { item = itm, index = indx + 1 })
                   .OrderBy(o => o.item).ToArray();
for (int i = 0; i < count/2; i++)
{
    Console.WriteLine($"{cards[i].index} {cards[count - 1 - i].index}");
}
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
26.07.2016, 20:28  [ТС]
SashaPl, Код не компилируется
0
50 / 37 / 9
Регистрация: 25.06.2014
Сообщений: 406
26.07.2016, 20:32
netrox,
подлючи System.Linq.
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
26.07.2016, 21:15  [ТС]
SashaPl, Подключал
Миниатюры
Решение задачи по раздаче карт с числами  
0
50 / 37 / 9
Регистрация: 25.06.2014
Сообщений: 406
26.07.2016, 21:19
netrox, а, ну это в 6-ом шарпе так можно. Можешь использовать string.Format вместо этого.
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
26.07.2016, 22:34  [ТС]
SashaPl, А для 6-ого шарпа нужна visual 2015 или на старых тоже пойдёт ?
0
50 / 37 / 9
Регистрация: 25.06.2014
Сообщений: 406
27.07.2016, 02:29
netrox, нужна 2015. Вместо этого можно использовать string.Format.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2016, 02:29
Помогаю со студенческими работами здесь

Найти решение уравнения, изоклинную и интегральную кривые, решение задачи Коши
Помогите пожалуйста! а) Найти решение вида: x=a,y=b,y=kx+b y'=\frac{y^2-4}{xy},\\ y'=x-y+2 б) Какая кривая является одновременно...

Аналитическое решение решение краевой задачи для ОДУ второго порядка
Здравствуйте! Задача: Аналитически найти частное решение ОДУ. Изначально в частных производных, но это оду(если я неправ поправьте!) ...

задачи с двумерным массивом, решение должно быть похоже на решение 8-ми классника
Без рандома, все вводится с клавиатуры, без Inc, без Break и т.д. 1)Сколько учеников не имеет в году задолженностей? 2)Распечатать...

Найдите общее решение и решение задачи Коши для ОДУ
Найдите общее решение и решение задачи Коши для ОДУ (с разделяющимися переменными, с однородной правой частью, или сводящееся к ним) : (1...

Найти общее решение или решение задачи Коши
вот пример:


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru