テラス席割り当て(20点)C++STL強解

2740 ワード

ps.悲しい时、友达の慰めがなくて、黙ってコードを叩いて、ある日会えることを期待しています.
プログラミングを何週間も習ったばかりで、うまく書けないので、後でゆっくりしてほしいですね.
エレベーター席配分(20点)
階段競技には毎年多くの選手が参加しており、同じ学校のすべての選手が隣接できないことを保証するには、座席の割り当てが面倒なことになります.そのため、ある競技場にN校が出場し、i校目にM[i]チームがあり、各チームに10人の参加選手が参加するという戦略を立てた.各校の選手を縦列に並べ、i+1チーム目の選手をiチーム目の選手の後に並べた.1校目から各校の1人目の隊員が順番に着席し、各校の2人目の隊員が…と推す.最終的に1校しか残っていないチームが席を割り当てていない場合は、彼らの選手を隔てて座るように手配する必要があります.本題では、各学校の隊員の座席番号を自動的に生成し、1から番号を付けるプログラムを作成する必要があります.
入力形式:
1行に与えられた参加高校数N(100を超えない正の整数)を入力する.2行目はN個の10を超えない正の整数を与え、そのうちi番目の数はi番目の高校の参加チーム数に対応し、数字間はスペースで区切られている.
出力フォーマット:
第1高校の第1チームから、順番にメンバーの座席番号が出力される.各チームは1行を占め、座席番号は1つのスペースで区切られ、行の先頭と末尾に余分なスペースがあってはならない.なお、各高校の1行目は「#X」で同校の番号Xを出力し、1から開始する.
サンプルを入力:
3
3 4 2

出力サンプル:
#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60

テーマの直観的な解釈:Nチームがあって、間隔を置いて座って、もしまだ1チームが残っているならば、間を開けてやります.それは最後のチームの前の1人が自分のチームなのか他のチームなのかを判断するだけで、他のチームの最初のチームであれば間位は必要ありません.そうしないと間位が必要です.
そんなにたくさん考えたくないのは、遍歴ではないでしょうか.この問題は条件タイムカードを見ていると深刻ではありません.そこで、強解でもできるし、問題を直感的に表現できると思ったので、
少し悲しくコードを叩いた.
#include
using namespace std;

void print(pair >A[],int x) {

	for (int i = 0; i < x; i++) {
		int cnt = 1;
		cout << "#" << i + 1 << endl;
		for (int j = 0, k = A[i].second.size(); j < k; j++,cnt++) 
			cnt % 10==0 ? printf("%d
", A[i].second[j]) : printf("%d ", A[i].second[j]); } } void solve() { pair >SS[1000 + 10]; int x; scanf("%d",&x); for (int i = 0; i < x; i++) { cin >> SS[i].first; } int no_ = 1; int edmax = -1; for (int gx=x==1?2:0,pd=1,zero=0;zero!=x ; ) { zero=0; for (int kn = 0; kn < 10; kn++) { for (int pn = 0; pn < x; pn++){ if (SS[pn].first > 0 && gx == 0) { SS[pn].second.push_back(no_++); } if (SS[pn].first > 0 && gx == 2) { if (pd) { vector::iterator f = find(SS[pn].second.begin(), SS[pn].second.end(), edmax); if (f != SS[pn].second.end()) no_+=1; pd = 0; } SS[pn].second.push_back(no_); no_ += gx; } } } for (int i = 0; i < x; i++) { if (SS[i].first > 0) SS[i].first--; if (SS[i].first == 0) zero++; edmax = edmax < SS[i].second[SS[i].second.size() - 1] ? SS[i].second[SS[i].second.size() - 1] : edmax; } if (zero == x - 1) gx = 2; } print(SS, x); } int main() { solve(); return 0; }