У меня возникла проблема с сложностью алгоритма. Я попытался найти решение ниже, думая, что это легко, когда я забыл учитывать временные ограничения. Я добавил код ниже, который я даже не уверен в сложности. Мне любопытно узнать, что такое решение O(N)
или . Если бы кто-то мог помочь с этим, это было бы очень признательно.Сложность времени при симуляции
Time Limit: 1 second
Доступно K мест, каждое из которых представлено физическим сиденьем в точке вокруг круга. Люди K + 1 также изначально стоят в точках по кругу. Точки на круге помечены по часовой стрелке от 1 до N, так что точка 1 сразу следует за точкой N. Ни один человек изначально не будет стоять в одной точке, и ни один из двух стульев не будет в одной точке.
Каждый второй, все люди, которые все еще стоят сделать следующее (одновременно):
Если человек стоит в той же точке, как пустой стул, человек сядет в Это.
В противном случае человек переместится на одно место по часовой стрелке по кругу в следующую точку. Если человек ранее находился в точке i (с номером i < N), человек теперь будет в точке i + 1. Если человек был ранее в точке N, человек будет теперь в точке 1.
Поскольку существует K + 1 человек, в конце концов, будут приняты все K мест и один человек оставшийся без места , Человек, сидящий на первом месте в круге, будет иметь лучшее место. («Первое» место в круге определяется как первое место по часовой стрелке от точки 1.)
Ваша задача - определить, кто будет на первом месте и кто будет стоять лицом.
Ввод N и K.
K целые числа в пространстве, представляющие точки, в которых есть стулья, в порядке возрастания. Следовательно, первым председателем в этом списке станет первое место
K + 1 целые числа, разделенные пробелами, представляющие точки людей, в порядке возрастания. Люди пронумерованы от 1 до K + 1 по своей позиции в этом списке.
1 ≤ N ≤ 1000000
1 ≤ K ≤ 100000
Выход
Человек в первом сиденье
Человек остался стоять
Sample
Input
10 3
2 5 8
3 4 6 8
Output
3
1
В первую секунду, четвертый человек (в точке 8) сразу садится на стул под ними. Остальные трое будут перемещать одно место вокруг круга. В следующую секунду второй человек (теперь в позиции 5) сядет на второе место. Первый и третий люди будут продолжать ходить по кругу, пока третий человек не достигнет позиции 2 и садится, оставив первого человека без кресла.
while(standing != 1)
{
for (int i = 0; i < K + 1; i++)
{
if (sitting[i] == 0)
{
people[i]++;
if (isSitting(people[i], chairs,i)) //this function checks if the current person is at a chair
{
sitting[i] = 1;
standing--;
}
if (people[i] > N)
{
people[i] = 1;
}
}
}
}
standingPerson = indexOf(sitting,K+1 ,0);
Эта попытка срабатывает почти на всем тестовом входе, только проходя 8/30 случаев.
Ниже приведено описание кода с помощью решения O (k), предлагаемого другим пользователем. Переведен в C++
int seat1 = chairs[0], best = -1, accum = 1;
int unlucky[] = {0, -1};
for (int pos; pos < K + 1; pos++) {
if (people[pos] <= seat1) {
best = people[pos] + 1;
accum -= 1;
} else
break;
}
if (accum < 0) {
unlucky[0] = accum;
unlucky[1] = 1;
}
int i = K, j = K - 1;
while (i >= 0 && people[i] > seat1) {
if (chairs[j] >= people[i]) {
accum += 1;
j -= 1;
} else {
accum -= 1;
i -= 1;
}
if (best == -1 && accum == 0) {
best = i + 2;
}
if (accum < unlucky[0]) {
unlucky[0] = accum;
unlucky[1] = i + 2;
}
}
fprintf(out_file, "%d\n%d", best, unlucky[1]);
Подсказка: точное местоположение людей и стульев не имеет значения. Стул, в который попадает человек, зависит только от порядка людей и стульев. Вы можете понять, почему? (Отказ от ответственности: убедитесь, что это действительно так, потому что я в настоящее время лишен сна.) – user2357112
@ user2357112 Я как бы думал о чем-то подобном, но не мог сказать, на каком стуле они могут попасть в –
. Один из способов приблизиться к проблема заключается в том, чтобы понять, что, если никто не стоит между человеком и следующим незанятым стулом, этот человек будет сидеть на этом стуле, и вы можете удалить человека и стул из проблемы. – user2357112