
Нужно определить максимальное количество символов, среди которых не более двух точек, правильный ответ 403, мой 377
Где может быть ошибка?
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <fstream>
using namespace std;
vector<size_t> split(const string& line, const char delim) {
stringstream ss(line);
vector<size_t> tokens;
string token;
while (getline(ss, token, delim)) tokens.push_back(token.length());
if (line.size() > 1 && line.back() == delim) tokens.push_back(0U);
return tokens;
}
size_t max_sequence(const vector<size_t>& box) {
const auto length = box.size();
if (length == 0U) return 0U;
else if (length == 1U) return box.front() ? box.front() : 1U;
else if (length == 2U) {
const auto sum = box.front() + box.back();
const auto dot = count(box.begin(), box.end(), 0U);
return sum + (dot ? dot : 1U);
}
const size_t stop = length - 1;
size_t sum = 0;
size_t seq = 0;
for (size_t i = 1; i < stop; ++i) {
sum = box[i - 1] + box[i] + box[i + 1];
if (seq < sum) seq = sum;
}
return seq + 2;
}
int main() {
ifstream inp("24-181.txt");
if (inp.is_open()) {
string line;
inp >> line;
auto box = split(line, '.');
auto seq = max_sequence(box);
cout << seq << '\n';
inp.close();
} else {
puts("File 24-181.txt not found!");
}
system("pause > nul");
}
файл больше чем переменная f используй другой тип или кусками грузи в переменную, последний символ выведи и проверь если он соответствует
fin >> f не будет работать должным образом, если в тексте есть пробелы или более одной строки. Задачи с посимвольным анализом можно решать. считывая символ прямо из файла.
На первый взгляд очевидный алгоритм if (n>2) n=0 работает не корректно, потому что отсекает всю часть последовательности до этого момента. А правильно - делить на два отрезка. (точка - первый отрезок - точка - второй отрезок - точка). если появляется четвертая точка, то выбрасывается первый отрезок и вместо него становится второй и т.д.
#include <fstream>
using namespace std;
int main()
{
ifstream inp("N:/test.txt");
char ch; int l1{}, l2{}, l3{}, lmax{}, n{};
while ((ch = inp.get()) != EOF) //пока не конец файла считывать символ
{
l3++; //головной отрезок всегда растет
if (ch == '.') //если найдена точка
{
n++;
if (lmax < l1 + l2 + l3) lmax = l1 + l2 + l3; //обновить максимальную длину
l1 = l2; l2 = l3; l3 = 0; //сместить отрезки к хвосту
}
}
if (lmax < l1 + l2 + l3) lmax = l1 + l2 + l3; //форсированно обновить длину при окончании файла
cout << lmax - (n>2); //с поправкой на количество точек
}