测试点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;
}
标签:pre,cnt,049,号码,int,天梯,L1,c1,分配
From: https://www.cnblogs.com/chengyiyuki/p/18070175