L1-049 天梯赛座位分配 (20分)
这题改变了我对循环使用的腐朽看法,增加了标记的使用,模拟法
关键点是题干:“如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。”
#include<bits/stdc++.h>
int main(void)
{
int n,num[111],maxi=0,max=0;
scanf("%d",&n); //input;
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
if(num[i]>max) max = num[i]; //process;
}
int a[111][11][11]; //a[school-i][team-j][people-k];
int i,j,k;
int prei=-1,step=0;
//循环并非常规的从外到内,而是根据需要选择内外循环,很有技巧性,很机智(也打破了我一般的常规思想,是进步的点)!
for(j=0;j<max;j++){ //最外层提前找到最大数量的team然后遍历
//(其实这里编代码的时候是要构思好再实现的
//但是如果是直接一次性下来,这个max可以改成函数返回一个最大值,比较清楚,
for(k=0;k<10;k++){ //然后学校循环结束,就是横向的每个队员进入座位;1--10循环(0--9)
for(i=0;i<n;i++){ //先看内循环,根据题设模拟需要,每个学校依次进入;也就是学校循环在内;
if(j<num[i]){
if(prei==i){ //如果前一个赋值的是同一个学校,间隔2,反之,则间隔1;
step+=2;//这里采取的还是人脑模拟,所以其实不用思考太多,直接抓住循环帮忙解决的赋值顺序,然后就好理解了;
}
else step++;
a[i][j][k]=step;
prei=i;
}
}
}
}
for(i=0;i<n;i++){
printf("#%d\n",i+1); //output;
for(j=0;j<num[i];j++){
for(k=0;k<10;k++)
{
if(k!=9)
printf("%d ",a[i][j][k]);
else
printf("%d",a[i][j][k]);
}printf("\n");
}
}
return 0;
}
dylan_sjc
发布了9 篇原创文章 · 获赞 3 · 访问量 200
私信
关注