L1-1 天梯赛座位分配
题解
这题说实话有坑!!!
因为题目没有直接说,如果前一个人和后一个人是同一所学校的需要隔位就作,如果不是同一个学校的就不需要隔位就坐。
这样说的原因为是,例如数据
数据一
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
数据二
2
1 2
答案
#1
1 3 5 7 9 11 13 15 17 19
#2
2 4 6 8 10 12 14 16 18 20
22 24 26 28 30 32 34 36 38 40
下面的需要从22起头,第一组数据从21起头就可以了,如果没有理解到这一点,这题可能很久都给过不了,气死我了!!!
代码
#include <bits/stdc++.h>
using namespace std;
queue<int> q[105];
int team[105];
int id=0;
void getNum(vector<int>& sc,int step) {
int sz=sc.size();
for (int i=0;i<10;i++) {
for (int j=0;j<sz;j++) {
id+=step;
q[sc[j]].push(id);
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n;
scanf("%d",&n);
vector<int> que,tmp;
for (int i=0;i<n;i++) {
scanf("%d",&team[i]);
que.push_back(i);
}
int step=1,last,flag=0;
while (que.size()) {
int sz=que.size();
if (sz==1) {
step=2;
if (!flag&&last!=que[0]) {
id--;
flag=1;
}
}
getNum(que,step);
last=que[sz-1];
que.clear();
for (int i=0;i<n;i++) {
team[i]--;
if (team[i]>0) {
que.push_back(i);
}
}
}
for (int i=0;i<n;i++) {
printf("#%d\n",i+1);
int cnt=0;
int print=0;
while (!q[i].empty()) {
if (print==0) {
print=1;
}
else {
printf(" ");
}
printf("%d",q[i].front());
q[i].pop();
cnt++;
if (cnt%10==0) {
printf("\n");
print=0;
}
}
}
return 0;
}