携程笔试 任务调度-贪心算法ac
基本思路:
1.如果节点个数和任务个数有一个为0,则输出0
2.如果节点个数大于等于任务个数,则输出任务里面耗时最大的那个
3.如果节点个数小于任务个数
(1)先把所有任务的耗时相加起来,相加之和除以节点,如果可以整除则直接整除,否则向上取整,这一步得到一个均值为jVal
(2)从jVal开始判断,如果jVal满足被调度的最小时间,则输出,否则jVal加1 继续判断
ps:判断方法:贪心选择,对任务数组进行遍历,累加遍历的时间,如果当前累计值>=jVal,则令累计值为0或者为最后加的那个耗时,同时不要忘记判断一共有多少个区间满足累加值<=jVal 如果区间数小于m,才可以说这个jVal满足条件。
下面是代码:
package xiechenglvxing; import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Main3 { static boolean judgeAns(int ans,int[]array,int m){ int cpuNodes=0; int temp=0; for(int i=0;i<array.length;i++){ if(temp+array[i]<ans){ if(i==array.length-1) cpuNodes++; temp+=array[i]; }else if(temp+array[i]==ans){ cpuNodes++; temp=0; }else if(temp+array[i]>ans){ if(i==array.length-1){ temp+=array[i]; }else{ cpuNodes++; temp=array[i]; } } } if(temp<=ans&&cpuNodes<=m) return true; else return false; } static int schedule(int m,int[] array) { if(m==0||array.length==0) return 0; if(m>=array.length){ int ans=Integer.MIN_VALUE; for(int i=0;i<array.length;i++){ if(array[i]>ans) ans=array[i]; } return ans; } //节点数小于任务数 int len=array.length; int jval=0; for(int i=0;i<len;i++) jval+=array[i]; //均值向上取整 if(jval%m==0){ jval=jval/m; }else{ jval=jval/m+1; } for(int i=jval;;i++){ if(judgeAns(i,array,m)){ return i; } } } public static void main(String[] args){ Scanner in = new Scanner(System.in); int m = in.nextInt(); int size = in.nextInt(); int[] array = new int[size]; for(int i = 0; i < size; i++) { array[i] = in.nextInt(); } int res = schedule(m,array); System.out.println(String.valueOf(res)); } }