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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.68
Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
#1

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

16.04.2011, 13:26. Просмотров 4391. Ответов 9
Метки нет (Все метки)

Задача:
После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько баллов набрал.
В районе считается подозрительной ситуация, когда в школе более двух учащихся набирают одинаковый наибольший балл по школе.
Районный методист решила выяснить номера этих школ.
Программа должна вывести номера этих школ, в любом порядке.
Если аткая школа окажется одна, нужно вывести наибольший балл в этой школе, с указанием того, что это наибольший балл.
Если таких школ не окажется, нужно вывести об этом сообщение.
На вход программе сначала подается число учеников, сдававших экзамен. В каждой из следующих 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++
Найти и вывести наименьший номер элемента массива, равного Х, или сообщение, что такого элемента нет. #include &lt;iostream&gt; using...

ЕГЭ Информатика С2 - C++
/*Опишите на русском языке или на одном из языков программирования алгоритм суммирования положительных элементов квадратной матрицы,...

ЕГЭ Информатика - C++
На вход программы подаются прописные латинские буквы, ввод этих символов заканчивается точкой. Напишите эффективную по времени работы и по...

ЕГЭ Информатика С2 (Массивы) - C++
Здравствуйте, решаю задачи для подготовки к ЕГЭ,все вроде бы легко,но проблема в том, что все ответы на Паскале. Решал такую задачу,...

Информатика - C++
Здравствуйте..Помогите пожалуйста с лабораторными по информатике?На языке С++?СМОЖЕТЕ КТО НИБУДЬ ПОМОЧЬ? Ребята вот ссылка лабы...

C4 ЕГЭ - C++
Нужно решить С4, прошу вашей помощи )) По каналу связи передаётся последовательность положительных целых чисел, все числа не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
17.04.2011, 16:09  [ТС] #2
довольно таки интересная задача =)
silent_1991
17.04.2011, 16:23
  #3

Не по теме:

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

neske
1482 / 849 / 76
Регистрация: 26.03.2010
Сообщений: 2,917
17.04.2011, 16:51 #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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.04.2011, 17:02 #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
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
02.05.2011, 15:02  [ТС] #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
106 / 106 / 4
Регистрация: 02.06.2009
Сообщений: 579
02.05.2011, 15:11 #7
В первой задаче кстати говоря, хранение имен и фамилий школьников - излишняя трата памяти, так как данные на решение не влияют: роль играет только последние два числовых параметра строки.
Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
02.05.2011, 15:19  [ТС] #8
да с первой я уже давно разобрался )) мне сейчасвторую надо )
Veyron
106 / 106 / 4
Регистрация: 02.06.2009
Сообщений: 579
03.05.2011, 00:02 #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: Во втором коде в вашем посте есть этот кусок, реализованный только циклов "пока", а не "для".
Annistone
Сообщений: n/a
03.05.2011, 23:34 #10
а у меня такой организационный вопрос:
а как собственно когда пишешь программу например в вижуалке проверить себя, то есть как послать себе исходные данные?

Добавлено через 11 минут
все проблема решена)спс
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2011, 23:34
Привет! Вот еще темы с ответами:

информатика - C++
Народ как решить такую задачу по инфе Задача 7 Семинар 1 Вычислить суммарные затраты на распечатку электронной книги Затраты...

Информатика 8-9 классы - C++
Народ! Срочно нудна помощь! Информатика 8-9 класс! Пожалуйста, кто сможет помочь=))

ЕГЭ по информатике - C++
Извините если не в ту тему написал, не могу понять куда лучше это написать. На каком языке сдавать ЕГЭ по информатике? Я знаю только...

Информатика ! очень нужно - C++
Дано натуральное число k . Напечатать k-ую цифру (не число!) последовательности из идущих подряд чисел Фибоначчи. 112358132134......


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.05.2011, 23:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru