L1-1 天梯賽座位分配
阿新 • • 發佈:2019-03-05
print 必須 策略 hellip ret printf 分隔 can bit
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
坑點 超過一組完成後 如最後一個人和剩下的那一組是同一組的話那必須隔一個座 否則不隔座
天梯賽每年有大量參賽隊員,要保證同一所學校的所有隊員都不能相鄰,分配座位就成為一件比較麻煩的事情。為此我們制定如下策略:假設某賽場有 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 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
坑點 超過一組完成後 如最後一個人和剩下的那一組是同一組的話那必須隔一個座 否則不隔座
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct P { 4 int s[20][15], l = 0, ok = 0; 5 int idx = -1; 6 }arr[110]; 7 int shu = 1, endarr; 8 void Tow(P &a) { 910 while (a.l - a.ok>0) { 11 a.idx++; 12 a.s[a.ok][a.idx] = shu; 13 shu += 2; 14 if (a.idx == 9) { 15 a.idx = -1; 16 a.ok++; 17 } 18 } 19 } 20 int n; 21 int main() 22 { 23 //freopen("in.txt", "r", stdin); 24 scanf("%d", &n); 25 for (int i = 0; i < n; i++) 26 scanf("%d", &(arr[i].l)); 27 bool f = true; 28 if (n <= 1) f = false; 29 int t = n; 30 while (f) 31 { 32 for (int i = 0; i < n; i++) { 33 if (arr[i].l - arr[i].ok>0) { 34 arr[i].idx++; 35 arr[i].s[arr[i].ok][arr[i].idx] = shu++; 36 if (arr[i].idx == 9) { 37 arr[i].idx = -1; 38 arr[i].ok++; 39 if (arr[i].l - arr[i].ok == 0) 40 t--; 41 } 42 endarr = i; 43 } 44 } 45 if (t <= 1) break; 46 } 47 for (int i = 0; i < n; i++) 48 if (arr[i].l - arr[i].ok>0) { 49 if (shu>1 && endarr == i) shu++; 50 Tow(arr[i]); 51 } 52 for (int i = 0; i < n; i++) { 53 printf("#%d\n", i + 1); 54 for (int j = 0; j < arr[i].l; j++) 55 { 56 printf("%d", arr[i].s[j][0]); 57 for (int k = 1; k < 10; k++) 58 printf(" %d", arr[i].s[j][k]); 59 printf("\n"); 60 } 61 } 62 return 0; 63 }
L1-1 天梯賽座位分配