銀行待ち行列問題のためのシングルキューマルチウィンドウサービス(25ポイント)(構造ソート)

銀行にサービスを提供するためのK個のウィンドウがあり、ウィンドウの前に黄色の線が設定され、すべての顧客が到着時間に応じて黄色の線の後に長い列に並んでいるとします。ウィンドウが空くと、次の顧客はそのウィンドウに移動してトランザクションを処理します。選択するウィンドウが複数ある場合、顧客は常に最小数のウィンドウを選択すると想定されます。

この質問では、サービスを待機するようになったN人の顧客の平均待機時間、最長待機時間、および最終完了時間を出力し、各ウィンドウでサービスを受ける顧客の数を数える必要があります。

入力形式:
最初の行を入力して、顧客の総数である正の整数N(≤1000)を指定します。次にN行を入力すると、各行は顧客の到着時間Tとトランザクション処理時間Pを指定し、入力データに到達しました時間は順番に並べられています。最後の行は正の整数K(≤10)を示します。これは開いているビジネスウィンドウの数です。ここでは、各顧客のトランザクションが処理される最大時間は60分であると想定しています。

出力形式:
1行目に平均待機時間(小数点以下1桁出力)、最長待機時間、最終完了時間を1スペースで区切って出力し、行末に余計なスペースはありません。 。

2行目には、各ウィンドウでサービスを提供している顧客の数を番号の昇順で出力します。番号はスペースで区切られ、行の終わりに余分なスペースを入れることはできません。

入力サンプル:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

サンプル出力:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

質問のアイデア:
使用する情報を格納するための構造を設定します。次に、対応する構造配列を確立して、「グループの順序」と「全体の順序」を確認します。

#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;

struct Student {
    
    
	string st;	//学号
	int score;	//分数
	int groupID;//考场号
	int grouprank;//在考场中的等级
	int allrank;//总排名
}student[30005];

bool cmp(Student a, Student b)
{
    
    
	if (a.score == b.score)		//分数相等,按学号增序
		return a.st < b.st;
	else
		return a.score > b.score;	//正常按分数从大到小
}

int main()
{
    
    
	int n;
	cin >> n;
	int sum = 0;
	for (int i = 1; i <= n; i++)
	{
    
    
		int k;
		cin >> k;
		for (int j = sum; j < sum + k; j++)
		{
    
    
			cin >> student[j].st >> student[j].score;
			student[j].groupID = i;
		}
		sort(student + sum, student + k + sum, cmp);
		student[sum].grouprank = 1;		//每个考场中第一名的排名是1
		for (int j = sum + 1; j < sum + k; j++)		//确定每个小组之间的排名
		{
    
    
			if (student[j].score == student[j - 1].score)
				student[j].grouprank = student[j - 1].grouprank;
			else
				student[j].grouprank = j-sum+1;
		}
		sum += k;		//算得总体人数

	}

	sort(student, student + sum, cmp);
	student[0].allrank = 1;		//和上面一致,分数最高的排名第一
	for (int j = 1; j < sum; j++)
	{
    
    
		if (student[j].score == student[j - 1].score)
			student[j].allrank = student[j - 1].allrank;
		else
			student[j].allrank = j+1;
	}
	cout << sum << endl;
	for (int i = 0; i < sum; i++)
	{
    
    
		cout << student[i].st << " " << student[i].allrank << " " << student[i].groupID << " " << student[i].grouprank << endl;
	}
	

	return 0;
}

おすすめ

転載: blog.csdn.net/xdg15294969271/article/details/114436723