测试点1提交了好多次,都没过去。找网上那些测试点输出结果是一样的,但就是过不去。
然后认真思考了一番,自己可能没理解好这道题。
我的理解错误在于,认为在最大的时候,号码应该是这一队的上一个人号码加上2。
实际上,只有上一个号码和他在同一队的时候,才这么干。如果不是同一队,依旧是加上1。
真是巨大的错误。
然后,我加了pre来记录上一个号码分配给了哪一队,然后在这一次分配的时候去判断。
这个问题就解决了。

#include <bits/stdc++.h>
using namespace std;
int a[200][1000],c1[200];//a[k][j]表示第k只队伍第j个位置的号码号是什么 
int main(){
    //c1[i]:第i只队伍人数 
	int n,tmp,maxv=0;
	cin >> n;
	for(int i=0;i<n;i++){
		cin >> tmp;
		c1[i]=tmp*10;
		maxv=max(maxv,c1[i]);
	} 
    int pre=0;
	//模拟分配座位号 
	int cnt=1;
	//cnt为当前手里拿着的座位号码 
	for(int j=0;j<maxv;j++){//j是索引值 
		for(int k=0;k<n;k++){//n第几只队伍
			if(j<c1[k]){
                if(pre==k&&j>=1){
                    a[k][j]=a[k][j-1]+2;
                }else{
				    a[k][j]=cnt;
				    cnt++;
                }
                pre=k;
			}
		}
	}
	//如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐
	for(int i=0;i<n;i++){
		cout<<"#"<<(i+1)<<'\n';
		for(int j=1;j<=c1[i];j++){
			cout << a[i][j-1];
			if(j%10==0||j==c1[i]) cout << '\n';
			else cout << " ";
		}
	}
	return 0;
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。