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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值