2013-12-13 2 views
1

Вы хотите добраться из города A до B, находящегося в милях на миллион, с помощью некоторого количества кабин. Где-то между городами (или в одном из них) находится кабина (каждая кабина начинает свое путешествие с базы). Каждая кабина имеет топливо в течение нескольких миль (ни одна из кабин не должна возвращаться на базу). Определите, возможно ли ваше путешествие с A до B.Путешествие между двумя городами с кабинами от

ВХОД:

Целые м, д, п (1 < = д < = т < = 10^8, 1 < = п < = 500000), что означает (в этом порядке): расстояние от А до B, расстояние от А до базы кабины, номер кабины. После этого n целых чисел означает, что i-я кабина имеет топливо для x_i-го миль пути.

ВЫВОД:

Одно целое число: минимальное количество такси вы будете использовать, чтобы получить от А до Б или 0, если это невозможно.

Я попытался справиться с этим с первым штрихом моего разума и (не удивительно), что это не было хорошей идеей. А именно, что я сделал:

sort(ALL(cabs)); 
reverse(ALL(cabs)); 

for(int i = 0; i < n; ++i) 
{ 
    toPosition = position <= d ? d-position : position - d; 

    if(cabs[0] <= toPosition) {printf("0"); return 0;} 

    position += (cabs[0]-toPosition); 
    cabs.erase(cabs.begin()); 
    ++solution; 

    if(position >= m) {printf("%lld", solution); return 0;} 
} 

Теперь toPosition расстояние от основания до текущего position мы находимся Тогда мы берем такси с полным бензобаком от основания (если нет ни одного. чтобы он мог приблизить нас к городу B, нет решения). Мы соответствующим образом меняем наш position (до максимальной пропускной способности кабины), снимите кабину и просто сделайте это, пока мы не в городе B.

Теперь я знаю, что решение неверно. Я даже нашел некоторые тесты, где он терпит неудачу. Однако я не могу понять, почему это происходит. Так, например, для испытания

14 4 2 
10 8 

Он выводит 0 в то время как он должен вывести 2. Я знаю, что это потому, что хочет идти 10-> 8 в то время как правильный порядок здесь 8 -> 10. Теперь вот где проблема возникает:

Почему этот вопрос имеет значение здесь в этой проблеме? Если нам все равно нужно покрыть все расстояние от А до В, и пока мы не войдем в базовое местоположение или после него, нам нужно вернуться с каждой кабиной, почему бы не использовать те, которые быстрее выполняли бы миссию по возврату?

+3

Пахнет домашней работой. Вы должны указать язык в своих тегах –

+0

Пахнет как тренировка прошлых проблем из различных конкурсов программирования. Я не указывал язык, потому что он вряд ли связан с C++, и код, который я разместил, настолько объяснителен, что я считал, что это не обязательно. Если больше вы думаете, что я должен добавить тег C++, почему бы и нет, я сделаю это. – Straightfw

+0

Думаю, вы получите больше внимания. Многие люди подписываются на тег C++, поэтому они будут уведомлены об этом вопросе, если они захотят получать обновления. –

ответ

0

Представьте, что у вас было 3 кабины, где только 1 имеет достаточное количество топлива, чтобы добраться до А, и он может получить вас на расстоянии 1 мили от базы; у вас достаточно топлива, чтобы доставить вас от базы до B; и у последнего достаточно топлива для 2-мильной поездки. Ясно, что вам нужно использовать «самую маленькую» секунду; если бы вы использовали другой, вы бы просто стеснялись B, с кабиной, которая не может связаться с вами, а тем более закончить работу.

Итак, да, порядок имеет значение.

0
  • д: расстояние в кабину базовой
  • м: расстояние от А до Б
  • INT [] cabMilliage: мили, что каждая кабина может сделать

Я полагал, один оптимизации стратегию, которую вы могли бы использовать: Начните строить свой путь «назад», от последнего кабины до первого. Чтобы покрыть расстояние от основания кабины до B, вы будете использовать только одну кабину, не можете использовать более одного, поэтому начните, выбрав этот. distBaseToB = m - d; Выберите минимальный cabMilliage [я]> = distBaseToB

вычислить точку, в которой эта кабина забрать вас pickUpPoint [0] = D - (cabMilliage [я] - distBaseToB)/2 сейчас, по-прежнему с петлей, выбирая минимальный cabMilliage [], который может забрать вас раньше на пути и принести вам pickUpPoint [0] до тех пор, пока вы не достигнете A (или не выйдете из кабин, которые могут забрать вас в этом месте дороги, потому что они не есть достаточно газа.)

+0

Я довольно уверен, что ваше решение не будет работать так же, как мое не потому, что оно основано на том же предположении, что либо такси с самым полным резервуаром, доступным в настоящее время, будет использоваться по возможности, либо нет ответа. Контрпример I и Скотт Хантер явно отклонили это отношение. – Straightfw

+0

ах, понял! - нам нужно некоторое отключение: решение грубой силы - это функция, которая выбирает кабину в каждом вызове и называет себя рекурсивно с каждой из оставшихся кабин, пока не достигнет B. Я боюсь, что это O (n!), и это не дает наименьшего числа кабин, но он отвечает на вопрос, можно ли достичь B. – user3076574

Смежные вопросы