题意就是按顺序分配,不过到最后只有一队的时候就要隔开坐,也就是当上一个分配的人是同校学生的时候,需要特判。
我还以为是从当前的人开始隔开坐。。。的确是没理解题意。附上测试数据。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <algorithm> 6 #define ll long long 7 8 using namespace std; 9 10 int n; 11 struct node 12 { 13 int m,cnt; 14 int pos[11][11]; 15 node() 16 { 17 m=cnt=0; 18 } 19 } nodes[110]; 20 21 int main() 22 { 23 int i,j,k,last; 24 while(scanf("%d",&n)!=EOF) 25 { 26 int sum=0; 27 for(i=0; i<n; i++) 28 { 29 scanf("%d",&nodes[i].m); 30 sum+=nodes[i].m; 31 nodes[i].cnt=0; 32 } 33 int amt; 34 for(i=1; i<=sum*10;) 35 { 36 amt=0; 37 for(j=0; j<n; j++) 38 if(nodes[j].cnt==nodes[j].m*10) 39 amt++; 40 else 41 last=j; 42 for(j=0; j<n; j++) 43 { 44 if(nodes[j].cnt==nodes[j].m*10) 45 { 46 continue; 47 } 48 nodes[j].pos[nodes[j].cnt/10][nodes[j].cnt%10]=i; 49 nodes[j].cnt++; 50 i++; 51 if(nodes[j].cnt==nodes[j].m*10) 52 amt++; 53 else 54 last=j; 55 if(amt==n-1)//排到最后一个学校的时候 56 { 57 if(i==2)//特判初始只有一个学校的时候 58 { 59 nodes[last].cnt=0; 60 i=1; 61 } 62 if(nodes[last].cnt%10)//最后剩下几队还多一人时要隔开一个座位 63 { 64 nodes[last].pos[nodes[last].cnt/10][nodes[last].cnt%10]=i; 65 nodes[last].cnt++; 66 i++; 67 i++; 68 } 69 for(j=nodes[last].cnt/10; j<nodes[last].m; j++) 70 { 71 for(k=0; k<10; k++,i+=2) 72 nodes[last].pos[j][k]=i; 73 } 74 break; 75 } 76 } 77 78 } 79 for(i=0; i<n; i++) 80 { 81 printf("#%d ",i+1); 82 for(j=0; j<nodes[i].m; j++) 83 { 84 for(k=0; k<9; k++) 85 printf("%d ",nodes[i].pos[j][k]); 86 printf("%d ",nodes[i].pos[j][k]); 87 } 88 } 89 } 90 return 0; 91 } 92 93 94 /* 95 96 97 2 98 1 2 99 100 2 101 2 1 102 103 2 104 1 0 105 106 3 107 3 1 1 108 109 3 110 3 4 2 111 112 #1 113 1 4 7 10 13 16 19 22 25 28 114 31 34 37 40 43 46 49 52 55 58 115 61 63 65 67 69 71 73 75 77 79 116 #2 117 2 5 8 11 14 17 20 23 26 29 118 32 35 38 41 44 47 50 53 56 59 119 62 64 66 68 70 72 74 76 78 80 120 82 84 86 88 90 92 94 96 98 100 121 #3 122 3 6 9 12 15 18 21 24 27 30 123 33 36 39 42 45 48 51 54 57 60 124 125 126 */
这次天梯赛校内选拔37人,排名25,别人拿的分是我的两倍。真的是太菜了。之前做过的原题都没过。