一道数学题

本文通过模拟场景解决了一个关于如何合理安排工人打水的问题。利用Java实现了一个定时器任务,模拟了不同时间段工人前往水井打水的过程,并考虑了往返时间和休息时间等因素,确保了在固定时间内使用最少的人力完成最多的打水任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道数学题是这样的:公司准备顾一批工人帮他们打水,水井开放的时间是一定的且要求此公司一个时间点只能一个人打水,为了节约成本,公司想打尽量多的水且雇佣的人数最少,其中往返时间是一定的,每个工人打完必须有休息时间,请问公司最少顾多少人?

今天模拟解决了下这个问题

首先建一张人员表

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;
		}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值