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

ЕГЭ Информатика С4 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.68
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
16.04.2011, 13:26     ЕГЭ Информатика С4 #1
Задача:
После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько баллов набрал.
В районе считается подозрительной ситуация, когда в школе более двух учащихся набирают одинаковый наибольший балл по школе.
Районный методист решила выяснить номера этих школ.
Программа должна вывести номера этих школ, в любом порядке.
Если аткая школа окажется одна, нужно вывести наибольший балл в этой школе, с указанием того, что это наибольший балл.
Если таких школ не окажется, нужно вывести об этом сообщение.
На вход программе сначала подается число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Кол-во баллов>

Номер школы -целое число от 1 до 99 (В районе школы с некоторыми номерами не существуют)
Кол-во Баллов целое число от 0 до 100

Пример входной строки:
Иванов Иван 50 87

Пример выходных данных:
5 50 74 87
Другой вариант выходных данных:
7
Наибольший балл = 74
Третий вариант выходных данных
Нет таких школ


Я написал такую программу, но как то не работает

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
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{string str,str1;
int N,i,k,d,m,n,x,max,max1,y=0,num,a[100][100];
bool flag=false;
for(i=0;i<100;i++)
for(int j=0;j<100;j++)
a[i][j]=0;
setlocale(LC_ALL,"Russian");
cout<<"Введите N: ";
cin>>N;
for(i=0;i<N;i++)
{   getline(cin,str);
    str1=str;
    for(int j=0;j<3;j++)
    {
    k=str.find(" ",0);
    str.erase(0,k+1);
    }
    for(int j=0;j<2;j++)
    {
    k=str.find(" ",0);
    str1.erase(0,k+1);
    }
    str1.erase(2,3);
 
 
 
    d=atoi(str1.c_str()); // номер школы
    m=atoi(str.c_str());// кол-во баллов
    n=0; 
    while(a[d][n]!=0)
    n++;    
    a[d][n]=m;
}
 
for(i=0;i<100;i++)
  { max=a[i][0];
    x=0;
      for(int j=0;j<100;j++)
     { 
         
         if(a[i][j]>max)
      {max=a[i][j];
        x=0;}
 
 
         else if (a[i][j]==max&&a[i][j]!=0)
       {x++;
      if(x==2)
      {y++;
       if(y==1)
       {num=i;
       max1=max; }
      }
       if(y==2)
           cout<<num<<" ";
       if(y>1)
           cout<<i<<" ";
         }
 
      }}
 
if(y==1)
{cout<<num<<endl;
cout<<"Наибольший балл: "<<max1<<endl;
}
 
if(y==0)
cout<<"Нет таких школ"<<endl;
return 0;
      }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2011, 13:26     ЕГЭ Информатика С4
Посмотрите здесь:

C++ Информатика
ЕГЭ Информатика С2 C++
ЕГЭ Информатика С2 (Массивы) C++
ЕГЭ Информатика С2 C++
C++ ЕГЭ Информатика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
17.04.2011, 16:09  [ТС]     ЕГЭ Информатика С4 #2
довольно таки интересная задача =)
silent_1991
17.04.2011, 16:23
  #3

Не по теме:

Цитата Сообщение от Sokolov Посмотреть сообщение
довольно таки интересная задача =)
Это чем же? Это задача из разряда "найти производную", потому что взятие производных - тупая механическая работа, сводящаяся к последовательному применению правил к исходной функции.

neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
17.04.2011, 16:51     ЕГЭ Информатика С4 #4
Ну вот, если доп. библиотеками не пользоваться, решил бы так:

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
#include <iostream>
#include <string>
 
typedef struct INFO
{
    std::string name;
    std::string surname;
    int school;
    int score;
} t_struct;
 
 
int main (void)
{
    int N;
    std::cout << "Enter the number of student: ";
    std::cin >> N;
 
    t_struct *MAS;
    MAS = new t_struct [N];
 
    for (int i = 0; i < N; i++)
    {
        std::getline (std::cin, MAS[i].name, ' ');
        std::getline (std::cin, MAS[i].surname, ' ');
        std::cin >> MAS[i].school >> MAS[i].score;
    }
 
    const int SIZE = 100;
    int school_max[SIZE] = {0}; // будем хранить максимумы по каждой школе.
    int school_number_max[SIZE] = {0}; // кол-во максимальных баллов по каждой школе.
 
    for (int i = 0; i < N; i++)
        if (MAS[i].score > school_max[MAS[i].school]) school_max[MAS[i].school] = MAS[i].score; // записываем максимумы.
 
    for (int i = 0; i < N; i++)
        if (MAS[i].score == school_max[MAS[i].school]) ++school_number_max[MAS[i].school]; // считаем кол-во максимумов.
 
    int count = -1;
    int suspicious_school[SIZE]; // будут храниться номера "подозрительных" школ.
 
    for (int i = 0; i < SIZE; i++)
        if (school_number_max[i] > 2)
        {
            ++count;
            suspicious_school[count] = i;
        }
 
    if (count == -1) std::cout << "No schools.";
    else if (count == 0)
    {
        std::cout << suspicious_school[0] << std::endl;
        std::cout << "Max score: " << school_max[suspicious_school[0]];
    }
    else
        for (int i = 0; i <= count; i++)
            std::cout << suspicious_school[i] << " ";
 
    std::cout << std::endl;
    delete (MAS);
    return 0;
}
Да и silent_1991 совершенно прав, просто время было)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.04.2011, 17:02     ЕГЭ Информатика С4 #5
Sokolov, Интересного ничего не увидел. Только муторно.

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
88
89
90
91
92
93
94
95
96
97
98
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
 
struct person
{
    person(const std::string& n="",
        const std::string& s="",
        const size_t sc_n_=0,
        const size_t note_=0):
    name(n), surname(s), sc_n(sc_n_), note(note_)
    {
    }
    std::string name;
    std::string surname;
    size_t sc_n;
    size_t note;
};
 
std::istream& operator >>(std::istream& is, person& one)
{
    is >> one.name >> one.surname >> one.sc_n >> one.note;
    return is;
}
 
std::map<size_t, std::vector<size_t> > find_notes_in_schools(const std::vector<person>& vec)
{
    std::map<size_t, std::vector<size_t> > notes_in_schools;
    std::vector<size_t> vc;
    for(std::vector<person>::const_iterator iter = vec.begin(); iter != vec.end(); ++iter)
    {
        std::map<size_t, std::vector<size_t> >::iterator m_iter;
        if((m_iter = notes_in_schools.find(iter->sc_n)) != notes_in_schools.end())
            m_iter->second.push_back(iter->note);
        else
        {
            vc.push_back(iter->note);
            notes_in_schools.insert(std::make_pair(iter->sc_n, vc));
            vc.clear();
        }
    }
    return notes_in_schools;
}
 
std::map<size_t, size_t> find_max_notes_in_schools
(const std::map<size_t, std::vector<size_t> >& map)
{
    std::map<size_t, size_t> res;
    for(std::map<size_t, std::vector<size_t> >::const_iterator iter = map.begin();
        iter != map.end(); ++iter)
        res.insert(std::make_pair(iter->first, *std::max_element(iter->second.begin(), iter->second.end())));
    return res;
}
 
std::map<size_t, size_t> find_schools_numbers
(const std::map<size_t, size_t>& max_notes_in_schools,
 const std::vector<person>& persons)
{
    std::map<size_t, size_t> res;
    for(std::vector<person>::const_iterator iter = persons.begin();
        iter != persons.end(); ++iter)
    {
        std::map<size_t, size_t>::const_iterator m_iter;
        if((m_iter = max_notes_in_schools.find(iter->sc_n)) != max_notes_in_schools.end())
        {
            if(iter->note == m_iter->second && res.find(iter->sc_n) == res.end())
                res.insert(std::make_pair(iter->sc_n, 1));
            else if(iter->note == m_iter->second && res.find(iter->sc_n) != res.end())
                ++res[iter->sc_n];
        }
    }
    return res;
}
 
int main()
{
    std::vector<person> vec((std::istream_iterator<person>(std::cin)), std::istream_iterator<person>());
    std::map<size_t, std::vector<size_t> > map = find_notes_in_schools(vec);
    std::map<size_t, size_t> mp = find_max_notes_in_schools(map);
    std::map<size_t, size_t> map_res = find_schools_numbers(mp, vec);
    std::vector<size_t> result;
    for(std::map<size_t, size_t>::iterator iter = map_res.begin();
        iter != map_res.end();
        ++iter)
    {
        if(iter->second > 2)
            result.push_back(iter->first);
    }
    if(result.empty())
        std::cout<<"There are no such schools\n";
    else if(result.size() == 1)
        std::cout<<result[0]<<'\n'<<"Max note is: "<< mp.find(result[0])->second<<'\n';
    else
        std::copy(result.begin(), result.end(), std::ostream_iterator<size_t>(std::cout, " "));
    return 0;
}
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
02.05.2011, 15:02  [ТС]     ЕГЭ Информатика С4 #6
Имеется список результатов голосования избирателей за несколько партий,
в виде списка названий данных партий. При этом некоторые голоса
являются недействительными, в этом случае вместо названия партии
записан один символ «.» (точка). Партия проходит в парламент, если за нее
отдано не менее 7% от общего числа действительных голосов (то есть от
количества строк в списке, которые не равны «.»).
На вход программе в первой строке подается количество избирателей в
списке N. В каждой из последующих N строк записано название партии, за
которую проголосовал данный избиратель, в виде текстовой строки или
один символ «.», если данный голос считается недействительным. Длина
строки не превосходит 50 символов, название может содержать буквы,
цифры, пробелы и прочие символы.
Пример входных данных:
16
Party one
Party two
Party one
Party one
Party two
Party two
.
Party three
Party one
Party one
Party two
Party one
Party two
Party two
Party one
Party two
Программа должна вывести список всех партий, прошедших в парламент, в
произвольном порядке. При этом название каждой партии должно быть
выведено ровно один раз, вне зависимости от того, сколько голосов было
отдано за данную партию.
Пример выходных данных для приведенного выше примера входных данных:
Party one
Party two
При этом следует учитывать, что количество голосов избирателей в исходном
списке может быть велико (свыше 1000), а количество различных партий в
этом списке не превосходит 10.

Я написал программу,но работает некоректно пожалуйста помогите мне найти мою ошибку
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
#include<iostream>
using namespace std;
int main()
{int N,i,j,k=0,golos=0;
string str[10],name;
int time[10];
cin>>N;
for(i=0;i<10;i++)
time[i]=0;
 
for(i=0;i<=N;i++)
{getline(cin,name);
if(name!=".")
{golos++;
for(j=0;j<k;j++)
if(str[j]!=name)
time[j]++;
else 
{str[k]=name;
time[k]++;
k++;
}}
else continue;
}
 
for(i=0;i<k;i++)
if(time[i]*100>=7*golos)
cout<<str[i]<<endl;
 
return 0;
}
Вот решение к этой задаче:
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
Решение на языке C++
#include<iostream>
using namespace std;
int main()
{
int n, Count[10], NumParties=0, NumVotes=0, i, j;
string Names[10], s;
cin>>n;
getline(cin,s);
for(i=0;i<n;++i)
{
getline(cin,s);
if(s!=".")
{
NumVotes++;
j=0;
while(j<NumParties && s!=Names[j])
++j;
if(j<NumParties)
++Count[j];
else
{
Names[j]=s;
Count[j]=1;
++NumParties;
}
}
}
for(i=0;i<NumParties;++i)
if(Count[i]*100>=NumVotes*7)
cout<<Names[i]<<endl;
}
Я не прошу писать код программы, просто пожалуйста покажите мне мою ошибку.
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
02.05.2011, 15:11     ЕГЭ Информатика С4 #7
В первой задаче кстати говоря, хранение имен и фамилий школьников - излишняя трата памяти, так как данные на решение не влияют: роль играет только последние два числовых параметра строки.
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
02.05.2011, 15:19  [ТС]     ЕГЭ Информатика С4 #8
да с первой я уже давно разобрался )) мне сейчасвторую надо )
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
03.05.2011, 00:02     ЕГЭ Информатика С4 #9
ну собсно вот:
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
#include <iostream>
using namespace std;
int main()
{int N,i,j,k=0,golos=0;
string str[10],name;
int time[10];
cin>>N;
for(i=0;i<10;i++)
time[i]=0;
 
for(i=0;i<N;i++) // было i=0, i<=N - лишняя итерация
{getline(cin,name);
if(name!=".")
{golos++;
for(j=0;j<k;j++)
if(str[j]!=name)//непонятное условие:если строки не равны - зачем увеличивать тайм?
time[j]++;
else 
{str[k]=name;
time[k]++;//можно было сделать time[k]=1, т.к. оно ноль, но это так, рекомендация
k++;
}}
else continue;
}
 
for(i=0;i<k;i++)
if(time[i]*100>=7*golos)
cout<<str[i]<<endl;
 
return 0;
}
 
/*
кусок с проверкой условия str[j]!=name надо переписать
for (j=0;j<k;j++)
    if (str[j]==name)
    {
        time[j]++;
        break;
    }
    if (j==k-1)
    {
        str[k]=name;
        time[k]++;
        k++;
    }
*/
Нужное отмечено комментариями. Гарантию работы не даю, т.к. щас чето среда глючит, проверить не получается. Но в целом должно быть так. И да, советую форматировать код, а то читать очень тяжело.

PS: Во втором коде в вашем посте есть этот кусок, реализованный только циклов "пока", а не "для".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2011, 23:34     ЕГЭ Информатика С4
Еще ссылки по теме:

C++ Информатика 8-9 классы
C++ C4 ЕГЭ
задача с4 егэ :( C++

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

Или воспользуйтесь поиском по форуму:
Annistone
Сообщений: n/a
03.05.2011, 23:34     ЕГЭ Информатика С4 #10
а у меня такой организационный вопрос:
а как собственно когда пишешь программу например в вижуалке проверить себя, то есть как послать себе исходные данные?

Добавлено через 11 минут
все проблема решена)спс
Yandex
Объявления
03.05.2011, 23:34     ЕГЭ Информатика С4
Ответ Создать тему
Опции темы

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