На прямой робот находится в позиции 0 (т. е. в момент времени t=0 робот находится в позиции 0). Робот получает N команд движения. Каждая команда содержит два целых числа T и X, где T представляет собой время, в течение которого робот получает команду, а X представляет собой конечную точку на прямой. Если робот получает команду, он начинает движение к точке назначения X со скоростью 1 единица в секунду и останавливается, когда достигает точки назначения. Робот игнорирует команды во время движения. N команд передаются в качестве входных данных для программы. Программа должна вывести количество команд, проигнорированных роботом, в качестве вывода. Затем программа должна вывести положение робота после обработки N команд.
Примечание. Все команды всегда даются в хронологическом порядке по времени T.
Example Input/Output 1:
Input:
3
1 5
2 4
6 1
Output:
1
1
Explanation:
At t=0, the position of the robot is 0
At t = 1, the robot receives the 1st command and its position is 0
At t = 2, the position of the robot is 1 (The 2nd command is ignored by the robot as it is moving)
At t=3, the position of the robot is 2
At t = 4, the position of the robot is 3
At t=5, the position of the robot is 4
At t=6, the position of the robot is 5 and it receives the 3rd command
At t=7, the position of the robot is 4
At t=8, the position of the robot is 3
At t=9, the position of the robot is 2
At t=10, the postion of the robot is 1
Only one command is ignored by the robot. So 1 in the first line.
The final position of the robot is 1. So 1 is printed in the second line.
Example Input/Output 2:
Input:
6
1 -5
2 4
3 5
4 0
7 6
10 1
Output:
4
6
Моя программа:
n=int(input())
pv=[]
for i in range(n):
a,b=map(int,input().split())
pv+=[[a,b]]
a=min(pv)[0]
b=max(pv)[0]
Я понял постановку задачи. Но я не знаю логики этого.
Не могли бы вы уточнить вашу проблему? Кроме того, это код, который вы написали, или код, который был вам предоставлен?
возможно, сначала используйте print()
, чтобы увидеть, что у вас есть в переменных.
если команду нужно выполнить сразу, когда ее получит робот, то нужно делать это прямо внутри for
-цикла и считать текущее время, а следующую команду сравнивать с текущим временем - и пропускать или выполнять. В этот момент вы получаете только все команды и не выполняете их. Вы не можете получить эти результаты, используя min
, max
@DanielWalker Мне нужно знать логику, как решить эту проблему
@furas Я получил массив, используя цикл for. Теперь мне нужно выполнить итерацию в зависимости от позиции. Хорошо, я попытаюсь повторить это в самом цикле for
поэтому начните повторять его - и создайте переменные для current time
и current position
. Я бы сделал немного иначе. Если новая команда имеет меньшее время, чем текущее время, вы пропустите ее. Если оно имеет большее (или равное) время, установите его как текущее время, рассчитайте расстояние между текущей позицией и новой позицией и добавьте его к текущему времени. Поэтому я не проверяю команду каждый раз, а только когда не двигаюсь.
Сначала вам нужно создать переменные для текущего времени и текущей позиции.
И переменная для подсчета пропущенных команд.
Далее вы можете начать повторять команды, и забыть о своих t=1
, t=2
, t=3
и т.д., потому что вам не нужно проверять новые команды в момент их поступления (потому что робот слишком ленив для этого), но вы можете проверять их, когда вы не двигаться (когда вы закончили предыдущую команду)
Если новая команда имеет время меньше текущего времени, вы можете пропустить ее (и увеличить счетчик)
Если новая команда имеет время больше (или равное), чем текущее время, вы можете сделать ход. Вы можете установить время команды как текущее время, рассчитать расстояние между новой позицией и текущим временем, добавить это расстояние к текущему времени и, наконец, установить новую позицию.
commands = [[1,5], [2, 4], [6, 1]]
commands = [[1, -5], [2, 4], [3, 5], [4, 0], [7, 6], [10, 1]]
current_time = 1
current_pos = 0
skiped = 0
for t, p in commands:
print(f'time: {current_time:2} | pos: {current_pos:2} | cmd: {t:2}, {p:2}')
if t < current_time:
print('>>> skip')
skiped += 1
else:
distance = abs(current_pos - p)
print('>>> distance:', distance)
current_time = t + distance
current_pos = p
print('----------------')
print('time:', current_time)
print('skip:', skiped)
print('pos :', current_pos)
Результат для первого списка
time: 1 | pos: 0 | cmd: 1, 5
>>> distance: 5
time: 6 | pos: 5 | cmd: 2, 4
>>> skip
time: 6 | pos: 5 | cmd: 6, 1
>>> distance: 4
----------------
time: 10
skip: 1
pos : 1
Результат для второго списка
time: 1 | pos: 0 | cmd: 1, -5
>>> distance: 5
time: 6 | pos: -5 | cmd: 2, 4
>>> skip
time: 6 | pos: -5 | cmd: 3, 5
>>> skip
time: 6 | pos: -5 | cmd: 4, 0
>>> skip
time: 6 | pos: -5 | cmd: 7, 6
>>> distance: 11
time: 18 | pos: 6 | cmd: 10, 1
>>> skip
----------------
time: 18
skip: 4
pos : 6
Если вы найдете какую-либо ошибку в этом коде !!! Пожалуйста, опубликуйте это здесь
открытый класс LazyRobot {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
int pos=0,time=0,ignorecom=0;
List<Integer> timing = new ArrayList<>();
List<Integer> dest = new ArrayList<>();
for(int i=0;i<N;i++) {
timing.add(sc.nextInt());
dest.add(sc.nextInt());
}
pos = dest.get(0);
time = timing.get(0)+Math.abs(pos);
for(int i=1;i<N;i++) {
if (timing.get(i)<time) {
ignorecom++;
continue;
}
else if (time<=timing.get(i)) {
time = timing.get(i);
time = time+Math.abs(Math.abs(dest.get(i)+Math.abs(pos)));
pos = dest.get(i);
}
}
System.out.println(pos+" "+ignorecom);
}
}
Правильно соблюдайте отступ.
у тебя ошибка или что?