思路
就是按学校来排序,最后那个学校没排完,就最后那个学校隔一个座位排
这里可以用一个二维数组mp[i][j]来判断,某个学校是否排完。
源码
#include<iostream>
#include<cstdio>
using namespace std;
int n,t,f,g,num,mx,mp[105][105],arr[105][105];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%d",&t);
for(int j=1; j<=t*10; j++) mp[i][j] = 1;
mx = max(t,mx);
}
f = 0;g = 0;num = 1;
/*思路:
就是按学校来排序,最后那个学校没排完,就最后那个学校隔一个座位排
这里可以用一个二维数组mp[i][j]来判断,某个学校是否排完。
*/
for(int i = 1;i <= mx * 10;i++) //这里代表位置
for(int j = 1;j <= n;j++) //这是学校
if(mp[j][i] == 1){ //说明这是要排的位置,若为0,不会进入循环排序
if(f != j){//如果f != j说明不是同一个学校
arr[j][i] = num++;
f = j;//记录当前的学校编号
}
else{ //同一个学校
num += 1;
arr[j][i] = num++;
f = j;
}
}
for(int i = 1;i <= n;i++){
printf("#%d\n",i);
for(int j = 1;j <= mx * 10;j++){
if(arr[i][j] != 0){
if(j % 10 == 1) printf("%d",arr[i][j]); //第一个数
else printf(" %d",arr[i][j]);
if(j % 10 == 0) printf("\n"); //排完一行
}
}
}
return 0; }