Возник такой вопрос: как реализовать решение следующей задачи на 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++, желательно используя переменную для лишней информации, а не строку (хотелось бы, чтобы программа занимала как можно меньше памяти). Спасибо.
#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";
}
Не знаю, разрешается ли на ЕГЭ С++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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делаю приложение, которое запускается на Windows 7/10 от пользователя с правами администратораПри этом запускается оно в обычном режиме (с ограниченными...
хочу хранить в векторе некоторые структуры,(много)Интересует вопрос почему такой код работает быстрее