昨天寒假集训第一题就是个挺恶心的模拟题,所以我跳过了,放到了最后才做。最后做的时候,我考虑第i个学校第j支队伍第k个人,所以用的三维数组硬解。还好时间限制不紧,不然我感觉要超时,自己的渣渣代码就不贴了,后来看到某位大佬的思路,非常的清晰明了,码量也很少,在此像大家分享。原文链接:L1-049. 天梯赛座位分配_小龙的博客-CSDN博客_天梯赛座位分配。
#include<iostream>
using namespace std;
int main(){
int map[105][105]={0},a[105][105]={0},n,m,max=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>m;
if(m>max)max=m;
for(int j=0;j<10*m;j++){
map[i][j]=1;//记录有人的位置
}
}
int num=1,flag=-1; //用flag记录上一个人的行下标(即所在学校),目的是为了
for(int i=0;i<10*max;i++){//最后剩下的独苗队伍没编号的,要隔开一个空位编号
for(int j=0;j<n;j++){
if(map[j][i]){ //这里要注意i和j的下标位置,i是列j是行,行依次变化,对应一个学校选一个人
if(flag!=j){
a[j][i]=num++;
flag=j;
}
else{//这就是独苗队伍的情况
num+=1;
a[j][i]=num++;//隔行编号
flag=j;
}
}
}
}
for(int i=0;i<n;i++){
printf("#%d\n",i+1);
for(int j=0;j<10*max;j++){
if(a[i][j])printf("%d%c",a[i][j],(j+1)%10==0?'\n':' ');//输出细节
}
}
return 0;
}