Java Advanced 5. Robotics
Условие:
https://softuni.bg/trainings/resources/officedocument/59899/exercise-java-advanced-may-2021/3345
Дава ми 10/100, като и 2та тестови примера са ми верни. И не знам къде ми е грешката.
Като направих дебъг, използвайки създаден от мен дълъг пример програмата ми работи точно както трябва.
Ето ми го кода:
public class Robotics {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
ArrayDeque<String> queue = new ArrayDeque<>();
String[] data = scan.nextLine().split(";");
Map<String, Integer> robots = new LinkedHashMap<>(); //има константни имена и секунди на робота
Map<String, Boolean> freeRobots = new HashMap<>(); //показва вярно ако не е зает и грешно ако е зает
Map<String, Integer> cooldown = new HashMap<>(); //даден е инт, който се намаля всеки път с 1
String[] robotData = new String[2];
for (int i = 0; i < data.length; i++) { //давам стойности на всичко
robotData[0] = data[i].split("-")[0];
robotData[1] = data[i].split("-")[1];
robots.put(robotData[0], Integer.parseInt(robotData[1]));
freeRobots.put(robotData[0], true);
cooldown.put(robotData[0], 0);
}
String[] time = scan.nextLine().split(":");
int hours = Integer.parseInt(time[0]);
int minutes = Integer.parseInt(time[1]);
int seconds = Integer.parseInt(time[2]);
String material = scan.nextLine();
while (!material.equals("End")) { //въвеждам продукти
queue.offer(material);
material = scan.nextLine();
}
while (queue.size() > 0) {
seconds++;
if (seconds == 60) {
seconds = 0;
minutes++;
if (minutes == 60) {
hours++;
minutes = 0;
}
}
for (Map.Entry<String, Integer> entry : robots.entrySet()) { //проверява заетите роботи и им намаля
//времето с 1, като костантата от robots не е променена
if (freeRobots.get(entry.getKey()) == false) {
cooldown.put(entry.getKey(), cooldown.get(entry.getKey()) - 1);
if (cooldown.get(entry.getKey()) == 0) { //ако времето е 0 го правя свободен
freeRobots.put(entry.getKey(), true);
}
}
}
boolean anyone = false; //проверява дали има робот, който е взел продукт
for (Map.Entry<String, Integer> entry : robots.entrySet()) { //дава на незаетите роботи задача
if (freeRobots.get(entry.getKey()) == true) {
freeRobots.put(entry.getKey(), false);
cooldown.put(entry.getKey(), entry.getValue());
System.out.print(entry.getKey() + " - " + queue.poll() + " ["); //извеждане и махане на най-горния
//елемент от опашката
if (hours < 10) {
System.out.print("0");
}
System.out.print(hours + ":");
if (minutes < 10) {
System.out.print("0");
}
System.out.print(minutes + ":");
if (seconds < 10) {
System.out.print("0");
}
System.out.println(seconds + "]");
anyone = true
break;
}
}
if (anyone == false) { //ако няма, мести продукта най-отзаде
queue.offer(queue.poll());
}
}
}
}
Мерси, аз не си мислех че има нужда изобщо да правя тази проверка. Виждам, че едната ми грешка ми е че излиза от рамките за време, за това ще потърся къде вероятно може да зацикли. Но и аз след като дебъгвах тази задача със състезателна трудност за половин час не открих да има проблем.