Форум программистов, компьютерный форум CyberForum.ru

Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде - C++

Восстановить пароль Регистрация
 
nuts23
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 30
25.07.2013, 09:42     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде #1
Здравствуйте.
Задана последовательность, содержащая n целых чисел. Необходимо найти число, которое встречается в этой последовательности наибольшее количество раз, а если таких чисел несколько, то найти минимальное из них, и после этого переместить все такие числа в конец заданной последовательности. Порядок расположения остальных чисел должен остаться без изменения.

Например, последовательность 1, 2, 3, 2, 3, 1, 2 после преобразования должна превратиться в последовательность 1, 3, 3, 1, 2, 2, 2.

Требуется написать программу, которая решает данную задачу.

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

Первая строка входного файла INPUT.TXT содержит число n — количество чисел во входной последовательности (3 ≤ n ≤ 100). Следующая строка содержит входную последовательность, состоящую из n целых чисел, не превышающих по модулю 100. Все числа в строке разделены пробелом.

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

В выходной файл OUTPUT.TXT выводится последовательность чисел, которая получается в результате названного преобразования. Все числа в последовательности должны быть разделены пробелом.
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
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N;
    scanf("%d", &N);
    int A[100];
    int B[201]; // от B[1] до [99] - кол-ство упоминаний чисел. Отрицательные числа (-1 и -99), B[100] - ноль, B[123] - 23;
    for (int i = 0; i < 201; ++i)
        B[i] = 0;
    int a;
    for (int i = 0; i < N; ++i)
    {
        scanf("%d", &A[i]);
        a = A[i];
        if (a < 0)
        {
            a = abs(a);
            B[a] += 1;
        }
        else
        {
            a += 100;
            B[a] += 1;
        }
    }
    int imax; // кол-ство упоминаний
    int z; // самое часто упоминаемое число
    z = 1000;
    imax = -2000;
    for (int i = 0; i < 201; ++i)
    {
        if (B[i] == imax)
        {
            if (i < z)
            {
                imax = B[i];
                z = i;
            }
        }
        else if (B[i] > imax)
        {
            imax = B[i];
            z = i;
        }
    }
    //printf("%d_%d", imax, z);
    if (z <= 99)
        z *= -1;
    else
        z -=100;
    for (int i = 0; i < N; ++i)
    {
        if (A[i] != z)
            printf("%d ", A[i]);
    }
    for (int i = 0; i < imax; ++i)
    {
        printf("%d ", z);
    }
    return 0;
}
Необходимо найти ошибку в коде, т.к. на 8 тесте у меня WA. В обсуждении указано, что, скорее всего, ошибка в работе с отрицательными числами, но все указанные там тесты проходит.
Заранее спасибо.

Добавлено через 5 минут
Всё ок, исправил.
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
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N;
    scanf("%d", &N);
    int A[100];
    int B[201]; // от B[1] до [99] - отрицательные числа (-1 и -99), B[100] - ноль, B[123] - 23;
    for (int i = 0; i < 201; ++i)
        B[i] = 0;
    int a;
    for (int i = 0; i < N; ++i)
    {
        scanf("%d", &A[i]);
        a = A[i];
        if (a < 0)
        {
            a = abs(a);
            a = 100-a;
            B[a] += 1;
        }
        else
        {
            a += 100;
            B[a] += 1;
        }
    }
    int imax; // кол-ство упоминаний
    int z; // самое часто упоминаемое число
    z = 1000;
    imax = -2000;
    for (int i = 0; i < 201; ++i)
    {
        if (B[i] == imax)
        {
            if (i < z)
            {
                imax = B[i];
                z = i;
            }
        }
        else if (B[i] > imax)
        {
            imax = B[i];
            z = i;
        }
    }
    //printf("%d_%d", imax, z);
    if (z <= 99)
    {
        z = 100-z;
        z *= -1;
    }
    else
        z -=100;
    for (int i = 0; i < N; ++i)
    {
        if (A[i] != z)
            printf("%d ", A[i]);
    }
    for (int i = 0; i < imax; ++i)
    {
        printf("%d ", z);
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2013, 09:42     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде
Посмотрите здесь:

Найти ошибку в коде C++
Найти ошибку в коде. C++
найти ошибку в коде: C++
C++ Найти ошибку в коде
C++ С++ задача (исправить ошибку в коде)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.07.2013, 10:16     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде #2
можно менее размашисто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
int main()
{
   freopen("input.txt","r",stdin);
   freopen("output.txt","w",stdout);
   int i, j, n, count[201] = {0}, a[100], max = 0;
   std::cin >> n;
   for(i = 0; i < n; i++)
   {
       std::cin >> a[i];
       ++count[a[i] + 100];
   }
   for(j = i = 200; i >= 0; i--)
       if (count[i] >= max)
           max = count[j = i];
   for(i = 0; i < n; i++)
       if (a[i] != (j - 100))
           std::cout << a[i] << " ";
   for(i = 0; i < count[j]; i++)
       std::cout << (j - 100) << " ";
   return 0;          
}
а можно вообще код сжать.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 11:57     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде #3
Код 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
 
int* it;
int arr[100], n, count[201] = {0};
 
int main()
{
    std::cin >> n;
    for (int i = 0; i<n; ++i) std::cin >> arr[i], ++count[arr[i]+100];
    it = std::max_element(count, count+201);
    std::for_each(arr, arr+n, [](int n){ if(&count[n+100]!=it) std::cout<<n<<" "; });
    for (int i = 0; i<*it; ++i) std::cout << (it-count-100) << '\n';
    return 0;   
}

Код 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
 
int n, arr[100], count[201]={0}, *it;
 
void print(int* pos)
{
    if (pos == arr+n) return;
    if (&count[*pos+100]==it) print(pos+1), std::cout << *pos << " ";
    else std::cout << *pos << " ", print(pos+1);
}
 
int main()
{
    std::cin >> n;
    for (int i = 0; i<n; ++i) std::cin >> arr[i], ++count[arr[i]+100];
    it = std::max_element(count, count+201);
    print(arr);
    return 0;
}

Не по теме:

специально для Thinker

Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.07.2013, 12:04     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде #4
Цитата Сообщение от Dani Посмотреть сообщение

Не по теме:

специально для Thinker

Не по теме:

речь была о том, что без stl можно код сжать. будет менее читаемо, но используется мощь языка с/с++, на что не способен паскаль

Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 12:17     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде #5
Thinker, например, во втором коде можно просто заменить std::max_element на один цикл, от чего ничего не поменяется.
Yandex
Объявления
25.07.2013, 12:17     Преобразование последовательности - 2 (задача с acmp). Найти ошибку в коде
Ответ Создать тему
Опции темы

Текущее время: 00:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru