题目链接
如果测试点1,2过不起的小伙伴看看这两组样例,只要做到了,本校的学生不挨着坐就可以过。意思是同一个学校的学生
x
x
x 和学生
x
+
1
x+1
x+1 的位置不能挨着
//#case1:
1
1
#1
1 3 5 7 9 11 13 15 17 19
//#case2:
2
2 1
#1
1 3 5 7 9 11 13 15 17 19
21 23 25 27 29 31 33 35 37 39
#2
2 4 6 8 10 12 14 16 18 20
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+9;
struct node
{
int cnt;
vector<int> ID;
}a[N];
int st[N];
int main(){
int n;
cin>>n;
int mx=0;
int sum=0;
for(int i=1; i<=n; i++){
int x;
cin>>x;
mx=max(x,mx);
a[i].cnt=x;
sum+=x*10;
}
int id=0;
for(int i=1; i<=sum; i++){
//各个学校
int tmp=n;
for(int j=1; j<=n; j++) {
if(a[j].ID.size()==a[j].cnt*10) tmp--;
}
for(int j=1; j<=n; j++){
if(a[j].ID.size()==a[j].cnt*10) continue;
id++;
if(tmp==1&&st[id-1]==j) id++;
st[id]=j;
a[j].ID.push_back(id);
}
}
for(int i=1; i<=n; i++){
cout<<"#"<<i<<'\n';
for(int j=0; j<a[i].ID.size(); j++){
printf("%d%c",a[i].ID[j],(j+1)%10==0?'\n':' ');
}
// puts("");
}
return 0;
}