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;
}
posted @ 2020-02-20 17:10  xyee  阅读(287)  评论(0编辑  收藏  举报