其他分享
首页 > 其他分享> > L1-049 天梯赛座位分配 (20分)

L1-049 天梯赛座位分配 (20分)

作者:互联网

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 私信 关注

标签:20,int,max,num,111,049,L1
来源: https://blog.csdn.net/dylan_sjc/article/details/104086311