天梯賽每年有大量參賽隊員,要保證同一所學校的所有隊員都不能相鄰,分配座位就成為一件比較麻煩的事情。為此我們制定如下策略:假設某賽場有 N 所學校參賽,第 i 所學校有 M[i] 支隊伍,每隊 10 位參賽選手。令每校選手排成一列縱隊,第 i+1 隊的選手排在第 i 隊選手之后。從第 1 所學校開始,各校的第 1 位隊員順次入座,然后是各校的第 2 位隊員…… 以此類推。如果最后只剩下 1 所學校的隊伍還沒有分配座位,則需要安排他們的隊員隔位就坐。本題就要求你編寫程序,自動為各校生成隊員的座位號,從 1 開始編號。
輸入格式:
輸入在一行中給出參賽的高校數 N (不超過100的正整數);第二行給出 N 個不超過10的正整數,其中第 i 個數對應第 i 所高校的參賽隊伍數,數字間以空格分隔。
輸出格式:
從第 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
模擬;
思路:用一個三維數組存儲第i個學校的第j個隊伍的第k個隊員的編號;
每個學校輪流分配編號,所以內層循環應為學校;同時用變量lasti存儲最后一個編號的學校,
如果跟i相同的話說明還剩一個學校。
代碼如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 int main() 6 { 7 int sets[100][10][10];//i個學校j個隊伍第k個人的編號 8 int n,maxt = -1; 9 int nums[100];//存儲每個學校的隊伍數量 10 cin >> n; 11 for(int i = 0;i < n;i++) 12 { 13 cin >> nums[i]; 14 maxt = max(nums[i],maxt);//記錄最大的隊伍數量 15 } 16 int num = 0,lasti = -1; 17 for(int j = 0;j < maxt;j++)//隊伍數量 18 for(int k = 0;k < 10;k++) 19 for(int i = 0;i < n;i++)//每個學校依次編號 20 if(j < nums[i])//還沒分配完所有的隊伍 21 { 22 if(lasti == i)//說明只剩下一個學校 23 num += 2; 24 else 25 num ++; 26 sets[i][j][k] = num; 27 lasti = i; 28 } 29 for(int i = 0;i < n;i++) 30 { 31 cout << "#" << i + 1 << endl; 32 for(int j = 0;j < nums[i];j++) 33 { 34 for(int k = 0;k < 10;k++) 35 { 36 cout << sets[i][j][k]; 37 if(k != 9) 38 cout << " "; 39 } 40 cout << endl; 41 } 42 } 43 return 0; 44 }