diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 63e9001..aa00ffa 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index c5772e2..98ab84f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,5 +8,5 @@ - + \ No newline at end of file diff --git a/src/main/java/com/dota/Main.java b/src/main/java/com/dota/Main.java index c85738e..e728e4a 100644 --- a/src/main/java/com/dota/Main.java +++ b/src/main/java/com/dota/Main.java @@ -4,6 +4,7 @@ import com.dota.domain.Doctor; import com.dota.domain.Week; import com.dota.domain.WorkEnum; +import java.util.ArrayList; import java.util.Arrays; public class Main { @@ -15,6 +16,11 @@ public class Main { static Doctor zh; static Doctor tgy; + // 日期 + static int days = 0; + // 医生下标 + static int idx = 0; + public static void main(String[] args) { init(); var doctorOrder = new Doctor[]{ @@ -56,15 +62,9 @@ public class Main { } static void schedule(Doctor[] doctors, Doctor[] outputOrder) { - // 日期 - int days = 0; - // 医生下标 - int idx = 0; - for (int k = 0; k < 2; k++) { for (int i = 0; i < 7; i++) { var d = doctors[idx]; - if (d.firstRest) { d.firstRest = false; d.works[0] = WorkEnum.HOLIDAY; @@ -92,7 +92,7 @@ public class Main { } days = (days + 1) % 7; - idx = (idx + 1) % doctors.length; + idx = (idx + 1) % 6; } fix(doctors); @@ -104,28 +104,45 @@ public class Main { } } + record Rest(int day, int cnt) { + } + // 给有调休的安排休息 // 保证同一组必须有一个在 static void rest(Doctor[] doctors) { + var list = new ArrayList(); + for (int i = 0; i < 5; i++) { + list.add(new Rest(i, 0)); + } + for (Doctor doctor : doctors) { - if (doctor.lastRestCount == 0) { - continue; - } - - int count = 0; - for (int j = 0; j < 5; j++) { - if (checkRest(j, doctor, doctors)) { - doctor.works[j] = WorkEnum.REST; - count++; - } - - if (count==doctor.lastRestCount) { - break; + for (int i = 0; i < 5; i++) { + if (doctor.works[i] == WorkEnum.DUTY || doctor.works[i] == WorkEnum.WORK) { + list.set(i, new Rest(i, list.get(i).cnt + 1)); } } } + + list.sort((a, b) -> b.cnt - a.cnt); + for (Doctor doctor : doctors) { - doctor.lastRestCount = doctor.restCount; + if (doctor.restCount == 0) { + continue; + } + + int i = 0; + int j = 0; + while (i < doctor.restCount) { + Rest r = list.get(j++); + if (checkRest(r.day, doctor, doctors)) { + j = 0; + doctor.works[r.day] = WorkEnum.REST; + i++; + list.add(new Rest(r.day, r.cnt - 1)); + list.remove(r); + list.sort((a, b) -> b.cnt - a.cnt); + } + } } } diff --git a/src/main/java/com/dota/domain/Doctor.java b/src/main/java/com/dota/domain/Doctor.java index 3f017fa..3dca8b4 100644 --- a/src/main/java/com/dota/domain/Doctor.java +++ b/src/main/java/com/dota/domain/Doctor.java @@ -2,9 +2,7 @@ package com.dota.domain; public class Doctor { public String name; - // 上周的调休 - public int lastRestCount; - // 下周的调休 + // 周五六日值班的调休 public int restCount = 0; // 门诊时间 @@ -34,6 +32,7 @@ public class Doctor { } public void reset() { + this.restCount = 0; for (int i = 0; i < 5; i++) { works[i] = WorkEnum.WORK; } @@ -44,8 +43,8 @@ public class Doctor { switch (name) { case "周晖" -> works[1] = WorkEnum.OPD; case "唐婷婷" -> works[2] = WorkEnum.OPD; - case "李宁" -> works[3] = WorkEnum.OPD; - case "章亮" -> works[4] = WorkEnum.OPD; + case "李宁" -> works[4] = WorkEnum.OPD; + case "章亮" -> works[3] = WorkEnum.OPD; } }