CCF-CSP 201609-2列車のチケット購入

問題の説明
  車の座席割り当てを処理するために、鉄道チケット購入システムに簡単な座席割り当てアルゴリズムを実装してください。
  車に20の列があり、各列に5席あるとします。便宜上、1〜100を使用してすべての座席に番号を付けます。最初の行は番号1〜5、2番目の行は番号6〜10、以下同様に続きます。20番目の行は番号96〜100です。
  チケットを購入する場合、人は1枚以上のチケットを購入できます。チケットは5枚までです。これらのチケットを隣接する座席の同じ列に配置できる場合は、最も小さい番号の隣接する座席に配置する必要があります。それ以外の場合は、(隣接しているかどうかに関係なく)番号が最も少ないいくつかの空の席に配置する必要があります。
  当初はすべてのチケットを購入していなかったと仮定して、チケットの購入手順を記載していますので、こちらの手順に従ってください。
入力フォーマット入力
  の最初の行には整数nが含まれており、チケット購入指示の数を示します。
  2番目の行にはn個の整数が含まれており、各整数pは1から5の間で、購入するチケットの数を示し、2つの隣接する数字の間のスペースで区切られています。
出力形式
  n行出力します。各行は1命令の処理結果に対応します。
  チケット購入指示pは、p枚のチケットを小から大にソートして出力します。
入力例
4
2 5 4 2
出力例
1 2
6 7 8 9 10
11 12 13 14
3 4
サンプルの説明
  1)2枚のチケットを購入し、座席1と2を取得します。
  2)5枚のチケットを購入して6〜10席を獲得します。
  3)4枚のチケットを購入し、11〜14席を獲得します。
  4)チケットを2枚購入して、3席と4席を獲得します。
評価ユースケースのサイズと合意
  すべての評価ユースケース(1≤n≤100)では、すべてのチケット購入の合計が100を超えません。

経験の要約:
座席の2次元配列を定義します。各行の最初の列は、行の空の座席の数として定義され、5に初期化されます。
各行の2列目から6列目はシートとして定義され、0に初期化されて、空のシートを表します。
ハードコアシミュレーションで十分です。

C ++コード:

#include<bits/stdc++.h>
using namespace std;
int sit[20][6];
int main() {
	int n;
	scanf("%d",&n);
	for(int i=0; i<20; i++) { //初始化每排座位的空座位数为5
		sit[i][0] = 5;
	}
	while(n--) {
		int p;
		bool flag = false;
		scanf("%d",&p);
		for(int i=0; i<20; i++) { //首先寻找是否有一排满足连续的座位
			if(sit[i][0]>=p) { //该排座位满足连续座位
				sit[i][0] -= p; //该排空座位数减去购买票数
				for(int j=1; j<6&&p>0; j++) { //遍历座位,寻找空座位
					if(0 == sit[i][j]){
						printf("%d ",5*i+j); //输出空座位
						p--;
						sit[i][j] = 1; //该座位坐人了
					}
				}
				flag = true;
				break;
			}
		}
		if(!flag){ //若没有一排是满足连续的座位,则一个一个寻找空位(可以不连续)
			for(int i=0;i<20&&p>0;i++){
				for(int j=1;j<6&&p>0;j++){
					if(0 == sit[i][j]){
						printf("%d ",5*i+j);
						p--;
						sit[i][0]--;
						sit[i][j] = 1;
					}
				}
			}
		}
		printf("\n");
	}
	return 0;
}
公開された111元の記事 ウォンの賞賛2 ビュー3533

おすすめ

転載: blog.csdn.net/m0_38088647/article/details/100665990