这道数学题是这样的:公司准备顾一批工人帮他们打水,水井开放的时间是一定的且要求此公司一个时间点只能一个人打水,为了节约成本,公司想打尽量多的水且雇佣的人数最少,其中往返时间是一定的,每个工人打完必须有休息时间,请问公司最少顾多少人?
今天模拟解决了下这个问题
首先建一张人员表
public class People {
private int id;
private boolean state;
private String backTime;
private String startTime;
public People(){}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getBackTime() {
return backTime;
}
public void setBackTime(String backTime) {
this.backTime = backTime;
}
public People(int id){
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
}
把我们模拟的时间进行分离一下,我也建了一个类
public class TimeSplit {
public int hours;
public int minutes;
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
public int getMinutes() {
return minutes;
}
public void setMinutes(int minutes) {
this.minutes = minutes;
}
}
下面写主函数,主要是个定时器,别的没啥
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test {
static Timer timer = new Timer(false);
public static void main(String[] args) {
Date time = new Date();
TimerCount.oldTime = Calendar.getInstance().get(Calendar.SECOND);
timer.schedule(new TimerCount(), time,5*1000);
}
}
下面在定时器里写了主要逻辑
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
public class TimerCount extends TimerTask{
public static int oldTime;
static int hours = 6;
static int counter,id,timer;
static double clock;
final int taskTime = 40;//taskTime=往返时间+休息时间
static People people = new People(1);
static int taskflag = 0;
String taskStart = getTaskList()[taskflag];//初始化任务列表
static List<People> list = new ArrayList<People>();//人员列表
@Override
public void run() {
//计算此时时刻时间 模拟时钟60s=60min
clock = hours+(double)counter*5/100;
System.out.println("北京时间:"+clock);
counter++;
if (counter>=12) {
counter = 0;
hours++;
}
//新任务开始
if (Double.valueOf(taskStart) == clock) {
int pflag = 0;
for (int i = 0; i < list.size(); i++) {
if( (list.get(i).getBackTime()!=null) && (clock>=Double.valueOf(list.get(i).getBackTime()) )){
list.get(i).setState(false);
System.out.println("闲人ID:"+list.get(i).getId());
}
}
if(list.size() != 0){
pflag = selectPer(list);
System.out.println("干活的孩子id:"+pflag);
if(pflag!=88888){
list.get(pflag-1).setState(true);
list.get(pflag-1).setStartTime(taskStart);
list.get(pflag-1).setBackTime(nextStartTime(taskStart));
System.out.println("下次可以干活的时间:"+nextStartTime(taskStart));
}
}
if((pflag==88888) || (list.size()==0)){
//添加苦力
id++;
People people = new People();
people.setId(id);
people.setState(true);
people.setStartTime(taskStart);
people.setBackTime(nextStartTime(taskStart));
list.add(people);
}
taskflag++;
if (taskflag == getTaskList().length) {
Test.timer.cancel();
}else {
taskStart = getTaskList()[taskflag];
}
}
}
//任务列表
public String[] getTaskList(){
String [] schedule = {"6.00","6.15","6.30","6.45","7.00","7.10","7.20","7.30","7.40","8.00","8.15","8.30","8.45","9.00"};
return schedule;
}
//下次可以干活的时间
public String nextStartTime(String setOutTime){
String[] timeString = setOutTime.split("\\.");//.的分割,前面需加转义字符\\
String hours = timeString[0];
String mins = timeString[1];
String nextTime = null;//最终返回的时间点
int dstMin = 0;
int startMIn = Integer.parseInt(mins);//起始时间
int temp = startMIn+taskTime;//是否起始时间+任务时间大于一小时
if(temp>60){
dstMin = taskTime-(60-startMIn);//如发车时间是6点55 结果是7点35
nextTime = Integer.parseInt(hours)+1+"."+dstMin;
}else {
nextTime = hours+"."+temp;
}
return nextTime;
}
//时间分离
public TimeSplit splitTime(String time){
TimeSplit tSplit = new TimeSplit();
String[] ts = time.split("\\.");
int Hours = Integer.parseInt(ts[0]);
int Minutes = Integer.parseInt(ts[1]);
tSplit.setHours(Hours);
tSplit.setMinutes(Minutes);
return tSplit;
}
//哪个大闲人出发
public int selectPer(List<People> list){
//返回那个合适的大闲人的id
int id = 0;
List<People> list1 =new ArrayList<People>();
for(int i = 0 ; i < list.size() ; i++){
People p1 = new People();
p1 = list.get(i);
if(p1.isState() == false){
list1.add(p1);
}
}
if(list1.size() == 0){
id = 88888;
}else{
double earliest = 25.0;
for(int j = 0 ; j < list1.size() ;j++){
People p2 = new People();
p2 = list1.get(j);
int pId = p2.getId();
Double earlier = Double.valueOf(p2.getBackTime());
if(earlier<earliest){
earliest = earlier;
id = pId;
}
}
}
return id;
}
}