程序基本算法习题解析 执行任务:实验室有n台服务器,每个服务器有唯一的编号(1~n)。现有q个任务,输出执行第i个任务的服务器的编号的和。

题目:

实验室有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;
}

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值