题目:
实验室有n台服务器,每个服务器有唯一的编号(1~n)。现有q个任务,每个任务被3个整数描述:
ti表示任务到达的时刻,ki代表该任务所需的服务器数量,di代表为了解决这个任务索要花费的时间。一开始所有的服务器都处于空闲状态,当在某一时刻有一个任务q,且有大于或等于任务所需的空闲服务器数量ki,那么按编号从小到大的ki个空闲服务器将在接下来的di秒内处于繁忙状态,如果发现当前空闲服务器数量少于任务所需空闲服务器数量ki,该任务会被忽视。
输入的第一行包括两个整数n和q(n=1~100,q=1~10e5),分别代表服务器数量和任务数。接下来的q行,每行包括3个整数ti,ki和di(ti=1~10e6,ki=1~n,di=1~1000)。分别代表第i个任务开始的时刻、需要的空闲服务器数量和完成该任务所需的时间。输出q行,第i行输出一个整数代表执行第i个任务的服务器的编号的和,如果忽视了该任务,则输出-1。
思路:
首先要根据输入的服务器和任务数量动态定义一些数组:serverNo[n]存放服务器编号,t[q]存放任务的开始时刻,k[q]存放任务需要的空闲服务器数量,d[q]存放完成该任务所需的时间,releaseTime [q+1]存放每个任务完成的时刻。
每个任务到达时,需要判断是否有足够的服务器供该任务使用,判断的依据是:如果该任务开始的时刻大于等于某个服务器释放上一个(或上几个)任务的时刻,则这个服务器可供该任务使用。一旦某个服务器执行了某个任务,那么就需要更新其对应的releaseTime。
代码如下:
// Chapter11_6.cpp : Defines the entry point for the application.
// 实验室有n台服务器,每个服务器有唯一的编号(1~n)。现有q个任务,每个任务被3个整数描述:
// ti表示任务到达的时刻,ki代表该任务所需的服务器数量,di代表为了解决这个任务索要花费的时间。
// 一开始所有的服务器都处于空闲状态,当在某一时刻有一个任务q,且有大于或等于任务所需的空闲服务器数量ki,
// 那么按编号从小到大的ki个空闲服务器将在接下来的di秒内处于繁忙状态,如果发现当前空闲服务器数量
// 少于任务所需空闲服务器数量ki,该任务会被忽视。
// 输入的第一行包括两个整数n和q(n=1~100,q=1~10e5),分别代表服务器数量和任务数。
// 接下来的q行,每行包括3个整数ti,ki和di(ti=1~10e6,ki=1~n,di=1~1000)。
// 分别代表第i个任务开始的时刻、需要的空闲服务器数量和完成该任务所需的时间。
// 输出q行,第i行输出一个整数代表执行第i个任务的服务器的编号的和,如果忽视了该任务,则输出-1。
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int n,q; //n:服务器数量,q:任务数
int i,j;
cout << "输入服务器数量n和任务数q:";
cin >> n >> q;
int *serverNo = new int[n]; //创建动态数组(存放服务器编号)
int *t = new int[q]; //创建动态数组(存放任务的开始时刻)
int *k = new int[q]; //创建动态数组(存放任务需要的空闲服务器数量)
int *d = new int[q]; //创建动态数组(存放完成该任务所需的时间)
int *releaseTime = new int[q+1]; //创建动态数组(存放每个任务完成的时刻)
//对服务器进行编号
for(i=0;i<n;i++)
serverNo[i] = i+1;
//接收每个任务的开始时刻、需要的空闲服务器数量和完成该任务所需的时间
cout << "输入每个任务的开始时刻t、需要的空闲服务器数量k和完成该任务所需的时间d:" << endl;
for(i=0;i<q;i++)
{
cout << "第" << i+1 << "个任务:";
cin >> t[i] >> k[i] >> d[i];
}
//任务开始前,把所有服务器的释放时间置0
for(j=0;j<n;j++)
releaseTime[j] = 0;
//遍历每个任务
for(i=0;i<q;i++)
{
cout << "第【" << i+1 << "】个任务:" << endl;
//遍历每台服务器,查找空闲服务器数量
int freeServer = 0;
int sum = 0; //存放执行某个任务的服务器编号和
for(j=0;j<n;j++)
{
if(t[i] >= releaseTime[j])
freeServer++;
}
//如果空闲服务器数量大于等于该任务所需的服务器数量时
if(freeServer >= k[i])
{
int temp = k[i]; //选择k[i]个服务器
//从小到大选择空闲服务器
cout << "空闲服务器为:";
for(j=0;j<n;j++)
{
//如果某个服务器空闲(任务来临时刻大于服务器释放时刻)
if(t[i] >= releaseTime[j])
{
//选择该服务器,将编号加入和变量中
sum = sum + serverNo[j];
cout << serverNo[j] << ' ';
//计算该服务器使用完的时刻
//把第j个任务使用的服务器的释放时刻存储在第j个releaseTime数组元素中
releaseTime[j] = t[i] + d[i];
temp = temp - 1;
}
if(temp <= 0)
break;
}
cout << endl << "服务器编号和为:" << sum << endl;
}
//如果空闲服务器数量小于该任务所需的服务器数量
else
{
cout << "没有足够多的服务器可使用 -1" << endl;
}
}
//释放空间
delete []serverNo;
delete []t;
delete []k;
delete []d;
delete []releaseTime;
system("pause");
return 0;
}
运行结果如下: