PATの練習

レコードの書き換え

質問を記録した最初のブログです。私はACMを1年間プレイしていますが、この習慣はありません。
最近、PTAグレードAの準備をしていますが、ちなみに、ピットを記録します(PATピットは実際にはクソではなく、データ範囲は指定されておらず、質問の意味は...)

1014列に並んで待っている(30分)

銀行のサービス用にN個のウィンドウが開いているとします。窓の前に黄色い線があり、待合室を2つの部分に分けています。顧客が並んで待つためのルールは次のとおりです。

各ウィンドウの前の黄色い線の内側のスペースは、M人の顧客との線を入れるのに十分です。したがって、すべてのN行がいっぱいになると、(NM + 1)番目の行の後(およびそれを含む)のすべての顧客は、黄色の行の後ろの行で待機する必要があります。
各顧客は、黄色い線を越えるときに待つ最短の線を選択します。同じ長さの行が2つ以上ある場合、お客様は常に最小数のウィンドウを選択します。
Customer [i]は、トランザクションが処理されるまでにT [i]分かかります。
これで、各顧客の処理時間が与えられたので、顧客がビジネスを行った正確な時間を伝えることになっています。

たとえば、銀行に2つのウィンドウがあり、各ウィンドウに2人の顧客が黄色い線の内側で待機しているとします。それぞれ1、2、6、4、3分かかるトランザクションで待機している5人の顧客がいます。午前8時、customer1はwindow1で提供され、customer2はwindow2で提供されます。Customer3はwindow1の前で待機し、customer4はwindow2の前で待機します。Customer5は黄色い線の後ろで待機します。

08:01に、customer1が完了し、customer5がwindow1の前の行に入るのは、その行が短くなっているように見えるためです。Customer2は08:02に、customer4は08:06に、customer3は08:07に、最後にcustomer5は08:10に出発します。

入力

各入力ファイルには、1つのテストケースが含まれています。各ケースは、4つの正の整数を含む行で始まります:N(<= 20、ウィンドウの数)、M(<= 10、黄色の線の内側の各行の最大容量)、K(<= 1000、顧客の数) 、およびQ(<= 1000、顧客クエリの数)。

次の行には、K人の顧客の処理時間であるK個の正の整数が含まれています。

最後の行にはQ個の正の整数が含まれています。これは、トランザクションを実行できる時間を尋ねている顧客を表します。顧客の番号は1からKです。

出力

Qの顧客ごとに、トランザクションが終了した時刻をHH:MMの形式で1行に印刷します。ここで、HHは[08、17]、MMは[00、59]です。なお、銀行は毎日17:00以降は休業しておりますので、17:00までご利用いただけないお客様は、「ごめんなさい」とご記入ください。

サンプル入力

2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
1
2
3
サンプル出力

08:07
08:06
08:1017
00
ごめんなさい

本旨:

銀行はビジネスのために列を作っています。n個のウィンドウがあります。各ウィンドウには黄色い線があります。黄色い線には最大m人がいます。残りの人は黄色い線の外側で
k人とビジネスの処理に必要な時間与えます。時間、p個人のビジネス処理の終了時刻を照会します。ビジネス開始時に17:00を超えると、出力は
08:00にビジネスを開始し、ビジネスは17:00に終了します。ビジネスがすでに処理されている場合は、ビジネスが処理されるまで処理を続行します。ウィンドウは最後まで閉じられます。
誰かが特定のウィンドウでビジネスの終了を処理する場合、黄色の線の外側の人はそのウィンドウの最後に移動して待機します。誰かが2つのウィンドウで同時にビジネスの終了を処理する場合は、小さいウィンドウ番号を選択します。

方法:
チームを選択するときは、最短で最高のチームを選択するだけであり、選択後にチームを再度変更することはできません。
このようにして、各チームは適切に維持されます。各チームの長が残りのサービス時間が最も少ない人と一緒に連れて行かれるたびに、時間はサービスの終わりにジャンプし、メンテナンスのために黄色い線のキューに誰かがいる場合は、それをチームに挿入します。
ちょっと面倒+嫌です。
言葉では言い表せないのは、いわゆる「銀行は毎日17:00以降は休業しているため、17:00より前にサービスを提供できないお客様については、代わりに「申し訳ありません」と出力する必要があることに注意してください。サービスは17:00に停止します。このように残業を強制するのは本当に良いですか?ウェイターはmmpを考えており、私も
上記を知っていることを前提にmmpをしています。40分間交換しました。このようにシミュレートしてから久しぶりです。長すぎたのかもしれません。
精神が本当に崩壊したので、時間がないところに変えて、cfに行きました。
提出数maxxxxxxx
コード:

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pr pair<int,int>
pr ti[20][20];
int cou[20];
int ans[1001];
int be[1001];
int main()
{
    
    
	int n, m;
	int k, q;
	cin >> n >> m >> k >> q;
	int i;
	queue<pr> que;
	for (i = 0; i < k; i++)
	{
    
    
		int t;
		cin >> t;
		if (i < n * m)
		{
    
    
			ti[i % n][i / n].first = t;
			ti[i % n][i / n].second = i;
			be[i] = 0;
			cou[i % n]++;
		}
		else que.push(mp(t, i));
	}
	int now = 0;
	while (k)
	{
    
    
		int mi = INT_MAX;
		for (i = 0; i < n; i++)
		{
    
    
			if (mi > ti[i][0].first && cou[i])
			{
    
    
				mi = ti[i][0].first;
			}
		}
		//cout << now << endl;
		now += mi;
		for (i = 0; i < n; i++)
		{
    
    
			if (cou[i])ti[i][0].first -= mi;
			if (!ti[i][0].first && cou[i])
			{
    
    
				k--;
				ans[ti[i][0].second] = now;
				int j;
				for (j = 0; j < cou[i] - 1; j++)
				{
    
    
					ti[i][j] = ti[i][j + 1];
					
				}
				if (que.size())ti[i][j] = que.front(), que.pop();
				else cou[i]--;
				if(cou[i])be[ti[i][0].second] = now+1;
			}
		}
	}
	while (q--)
	{
    
    
		int w;
		cin >> w;
		w--;
		if (be[w]<=540)printf("%02d:%02d\n", ans[w] / 60 + 8, ans[w] % 60);
		else cout << "Sorry" << endl;
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/ylwhxht/article/details/103413390