Как реализовать решение задачи ЕГЭ на C++?

333
19 ноября 2021, 14:40

Возник такой вопрос: как реализовать решение следующей задачи на C++? Вводятся число N - количество строк. В каждой из N строк через пробел вводятся 4 значения: название АЗС (не более 20 символов), название улицы (не более 20 символов), марка бензина (92, 95, 98), цена за бензин этой марки (число от 1000 до 3000). Программа должна выводить три числа через пробел - количество АЗС, на которых бензин каждой марки продаётся дешевле всего. На Паскале решение этой задачи выглядит так:

var min, ans: array[92..98] of integer; // Массивы для минимальной цены и для количества АЗС
    c: char; // "Мусорная" переменная для ввода названия АЗС и улицы
    i, k, N, b: integer;
begin
   for i:=92 to 98 do begin // Заполнение массивов
      min[i]:=3001; // Максимальная цена за бензин = 3000, поэтому заполняем массив 3001
      ans[i]:=0; // Счётчик количества АЗС
   end;
   readln(N); // Ввод количества АЗС
   for i:=1 to N do begin
      repeat // Ввод названия АЗС до тех пор, пока не будет введён пробел
         read(c);
      until c=' ';
      repeat // Ввод улицы до тех пор, пока не будет введён пробел
         read(c);
      until c = ' ';
      readln(k, b); // Ввод марки бензина и его цены
      if b<min[k] then begin // Если цена меньше минимума за эту марку
         min[k] := b; // Минимум = цена
         ans[k] := 1; //  Количество АЗС = 1
      end else if min[k] = b then // Если минимум = цене
         ans[k] := ans[k] + 1; // Количество АЗС +1
   end;
   writeln (ans[92], ' ', ans[95], ' ', ans[98]); // Вывод количеств АЗС с наиболее низкими ценами каждой марки
end.

Суть в том, что название АЗС и название улицы для ответа по сути не нужны. В связи с этим логичнее было бы записывать их в отдельную переменную, которая с каждой новой введённой буквой будет перезаписываться, до тех пор, пока не будет введён пробел (пробел = конец ввода слова). Попытался сделать так же на C++, но понял, что cin >> не учитывает пробелы. Потом попытался сделать то же самое с cin.get(), но столкнулся с проблемой, что он учитывает ещё и символ новой строки и поэтому работает неправильно. cin.getline() на сколько я понял работает только со строками, и поэтому с переменной это сделать не получится. Подскажите, как вообще можно реализовать решение этой задачи на C++, желательно используя переменную для лишней информации, а не строку (хотелось бы, чтобы программа занимала как можно меньше памяти). Спасибо.

Answer 1
#include <iostream>
#include <cstdlib>
/*
 * Вводятся число N - количество строк.
 * В каждой из N строк через пробел вводятся 4 значения:
 * название АЗС (не более 20 символов),
 * название улицы (не более 20 символов),
 * марка бензина (92, 95, 98),
 * цена за бензин этой марки (число от 1000 до 3000).
 *
 * Программа должна выводить три числа через пробел -
 * количество АЗС, на которых бензин каждой марки продаётся дешевле всего.
 */
using namespace std;
struct GasStation{
    char* stationName = new char[20];
    char* streetName = new char[20];
    int mark;
    int price;
public: GasStation(char* _stationName, char* _streetName, int _mark, int _price){
        stationName = _stationName;
        streetName = _streetName;
        if (_mark == 92 || _mark == 95 || _mark == 98)
            mark = _mark;
        if (_price >= 1000 && _price <= 3000)
            price = _price;
    }
};

struct MinPriceCount{
    int minPrice92 = 0;
    int minPrice95 = 0;
    int minPrice98 = 0;
public: MinPriceCount(int min92, int min95, int min98){
        minPrice92 = min92;
        minPrice95 = min95;
        minPrice98 = min98;
    }
};
MinPriceCount searchMinPrice(int amount);
void printMinPrice(MinPriceCount minPr);

int main() {
    cout << "Enter amount gas station: ";
    int amount;
    cin >> amount;
    printMinPrice(searchMinPrice(amount));
    system("pause");
    return 0;
}
MinPriceCount searchMinPrice(int amount){
    char* stationName = new char[20];
    char* streetName = new char[20];
    int mark;
    int price;
    int minPrice92 = 3000;
    int minPrice95 = 3000;
    int minPrice98 = 3000;
    int countMinPrice92 = 0;
    int countMinPrice95 = 0;
    int countMinPrice98 = 0;
    for (int i = 0; i < amount; ++i) {
        cout << "Enter name of gas station, street, mark and price: ";
        cin >> stationName >> streetName >> mark >> price;
        GasStation gasStation(stationName, streetName, mark, price);
        if (gasStation.mark == 92 && gasStation.price < minPrice92){
            minPrice92 = gasStation.price;
            countMinPrice92 = 1;
        }
        else if (gasStation.mark == 92 && gasStation.price == minPrice92)
            countMinPrice92++;
        if (gasStation.mark == 95 && gasStation.price < minPrice95){
            minPrice95 = gasStation.price;
            countMinPrice95 = 1;
        }
        else if (gasStation.mark == 95 && gasStation.price == minPrice95)
            countMinPrice95++;
        if (gasStation.mark == 98 && gasStation.price < minPrice98){
            minPrice98 = gasStation.price;
            countMinPrice98 = 1;
        }
        else if (gasStation.mark == 98 && gasStation.price == minPrice98)
            countMinPrice98++;
    }
    MinPriceCount minPrice(countMinPrice92, countMinPrice95, countMinPrice98);
    return minPrice;
}
void printMinPrice(MinPriceCount minPr){
    cout << minPr.minPrice92 << " " << minPr.minPrice95 << " " << minPr.minPrice98 << "\n";
}
Answer 2

Не знаю, разрешается ли на ЕГЭ С++11

#include <array>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
int main(){
    size_t n;
    cin >> n;
    array<int, 3> ms = {92, 95, 98};
    map<int, int> min_p, ans;
    transform(ms.begin(), ms.end(), inserter(min_p, min_p.end()),
        [](int m){ return make_pair(m, numeric_limits<int>::max()); });
    transform(ms.begin(), ms.end(), inserter(ans, ans.end()),
        [](int m){ return make_pair(m, 0); });
    for(size_t i = 0; i < n; ++i){
        string nil;
        int m, p;
        cin >> nil >> nil >> m >> p;
        if(p < min_p[m]){
            min_p[m] = p;
            ans[m] = 1;
        } else if(p == min_p[m]){
            ++ans[m];
        }
    }
    for(auto& pair: ans){
        cout << pair.second << " ";
    }
    return 0;
}
READ ALSO
Как повысить привилегии приложения (UAC)

Как повысить привилегии приложения (UAC)

Делаю приложение, которое запускается на Windows 7/10 от пользователя с правами администратораПри этом запускается оно в обычном режиме (с ограниченными...

178
Почему std::vector.push_back(new struct()) работает медленнее чем std::vector.push_back(struct_item)

Почему std::vector.push_back(new struct()) работает медленнее чем std::vector.push_back(struct_item)

хочу хранить в векторе некоторые структуры,(много)Интересует вопрос почему такой код работает быстрее

192
Ошибка при трансяции потока через хромкаст cast_sender.js

Ошибка при трансяции потока через хромкаст cast_sender.js

Добавляю хромкаст согласно туториалу

189