m个机器、n个任务,每个机器执行任务时的时间不同,如何分配任务让机器调度使得总时间最短?
如:2 个机器 6个任务 每个机器执行任务时间分别是10min和7min
假设3 3 分,需要max(30,21) = 30
假设4 2 分, 需要max(40,14)=40
假设2 4 分,需要max(20,28) = 28
求调度策略
思路:二分,
最多需要min(t[0]...t[m-1])*的时间,最少是0;low = 0, high = n*min(t[0]...t[m-1])
取得mid,
判断 mid/t[0]+mid/t[1]+mid/t[2]+...mid/t[m-1] >= n high = mid-1;
否则 low = mid+1;
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
void ept(int t[],int m,int n){ // m台机器,n个任务
int mixx = t[0],maxx = t[0];
for(int i = 1;i < m;i++){
if(maxx < t[i])
maxx = t[i];
if(mixx > t[i])
mixx = t[i];
}
if(m >= n){
printf("%d\n",maxx);
}else{
int low = 0,high = n*mixx;
//printf("low = %d high = %d\n",low,high);
while(low <= high){
int mid = (low+high)/2;
int cnt = 0;
for(int i = 0;i < m;i++){
cnt += mid/t[i];
}
if(cnt >= n){
high = mid - 1;
}else if(cnt < n){
low = mid + 1;
}
}
printf("%d",low);
}
}
int main(){
int m,n; // m台机器 n个任务
int t[100];
while(scanf("%d%d",&m,&n) != EOF){
for(int i = 0;i < m;i++)
scanf("%d",&t[i]);
ept(t,m,n);
}
system("pause");
}
测试样例如下:
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
void print_rotate_matrix(int s[100][100],int n){
int i;
for(int j = n-1;j >= 0;j--){
i = 0;
int p = j;
while((i <= n-1) && (p <= n-1)){
printf("%d ",s[i][p]);
i++;
p++;
//printf("%d %d\n",i,j);
}
printf("\n");
}
for(int i = 1;i <= n-1;i++){
int j = 0;
int p = i;
while(p <= n-1 && j <= n-1){
printf("%d ",s[p][j]);
p++;
j++;
}
printf("\n");
}
}
int main(){
int n;
int s[100][100];
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++)
scanf("%d",&s[i][j]);
}
printf("\n");
print_rotate_matrix(s,n);
}
system("pause");
}