Как сохранить данные с первого запуска, чтобы во втором запуске их можно было использовать?
Есть простая задача, которая запускается два раза, причем входные данные при втором запуске зависят от того, что вывело решение при первом запуске.
Описание задачи: Есть последовательность чисел от 1 до n, причем все числа встречаются один раз. Два числа в этой последовательности пропущены, их надо вывести при втором запуске (это вся задача...)
Первый запуск:
Входные данные:
- Вводится слово "first";
- Затем следуют два числа (длина последовательности и длина первой части последовательности);
- Числа из первой части последовательности, которые надо запомнить.
Выходные данные:
- Выводится памятка, которая подается во второй строке второго запуска (Памятка может быть любой, главное из нее получить необходимую информацию)
Второй запуск:
Входные данные:
- Вводится слово "second";
- Затем вводится памятка ?? (вот это как раз таки вся сложность задачи);
- Затем следуют два числа (длина последовательности и длина второй части последовательности);
- Вторая часть последовательности.
Выходные данные:
- Два пропущенных числа этой последовательности
Пробовал сохранять в файл, но тесты не проходят (олимпиадная задача):
if order == 'first':
f = open('text.txt', 'w')
input()
memo = ' '.join(input().split())
f.write(memo)
print(memo)
f.close()
else:
f = open('text.txt')
left = f.read()
print(left)
left = set(map(int, left.split()))
n = int(input().split()[0])
right = set(map(int, input().split()))
allNumbers = set(range(1, n + 1))
print(*(allNumbers - left - right))
f.close()```
Ответы (1 шт):
В качестве эксперимента*, что достаточно выводить как промежуточные данные сумму и сумму квадратов, для чего 1000 символов за глаза...
#include <vector>
#include <algorithm>
#include <iostream>
#include <random>
using namespace std;
default_random_engine rgen{random_device{}()};
constexpr long long N = 300000;
pair<long long,long long> first(vector<int>::iterator b, vector<int>::iterator e)
{
pair<long long,long long> p{0,0};
for(auto it = b; it != e; ++it)
{
long long i = *it;
p.first += i;
p.second += i*i;
}
return p;
}
pair<long long,long long> second(vector<int>::iterator b, vector<int>::iterator e,
long long s, long long q)
{
for(auto it = b; it != e; ++it)
{
long long i = *it;
s += i;
q += i*i;
}
long long n = N*(N+1)/2 - s;
long long m = N*(N+1)*(1+2*N)/6 - q;
long long x = round((n+sqrt(2*m-n*n))/2);
long long y = n - x;
return make_pair(x,y);
}
int main(int argc, char * argv[])
{
vector<int> v(N);
for(int i = 0; i < N; ++i) v[i] = i+1;
shuffle(v.begin(),v.end(),rgen);
long long div = N/2 + uniform_int_distribution<>(-N/4,N/4)(rgen);
auto [s,q] = first(v.begin(),v.begin()+div);
auto [x,y] = second(v.begin()+div,next(v.end(),-2),s,q);
long long a = *next(v.end(),-2), b = *next(v.end(),-1);
cout << x << " " << y << " vs " << a << " " << b << endl;
}
* Это не решение поставленной задачи, а намек на ее решение.
P.S. Есть у меня подозрение, что именно это и имелось в виду, потому как при подсчете суммы квадратов по приведенной формуле получается почти заполненный long long :)
