当前位置: 代码迷 >> 综合 >> 1017. 座位分配
  详细解决方案

1017. 座位分配

热度:90   发布时间:2023-12-06 11:30:14.0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:
这题目属于光看测试数据被吓死的,一开始以为很难,然后就一直没做,然后静下心来之后,发现只是输出看着多了点而已
用一个struct套一个队列
整个学校的队伍人数先看成一个整体这样比较好操作(我一开始是又分小组的,然后搞来搞去麻烦很多,看成一个整体的话,只要在输出的时候十个十个输出就行)
依次往学校的空位上放人就行,因为要判断最后剩下的是否只有一个学校,所以需要一个tot变量(所有学校还没被安排座位的队员)来辅助判断

#include <cstdio>
#include <iostream>
using namespace std;
int n,tot,a[1111];
int maxx=-0x3f3f3f3f;
struct QUEUE
{
    int head,tail,data[11111];void init(){
    head=0,tail=0;}int size(){
    return tail-head;}int front(){
    return data[head];}int back(){
    return data[tail-1];}void pop(){
    head++;}void push(const int &x){
    data[tail]=x;tail++;}
};
struct SCHOOL
{
    int num;QUEUE st;
}s[111];
int main()
{
    cin>>n;for(int i=1;i<=n;i++){
    int x;cin>>x;maxx=max(x,maxx);a[i]=x;s[i].num=10*x;tot+=s[i].num;}int j=1;while(tot){
    for(int i=1;i<=n;i++){
    if(s[i].num){
    tot--;s[i].num--;if(tot==s[i].num){
    s[i].st.push(j);j+=2;}else {
    s[i].st.push(j);j++;}} }}for(int i=1;i<=n;i++){
    cout<<"#"<<i<<endl;for(int k=1;k<=a[i];k++){
    for(int l=1;l<=10;l++){
    cout<<s[i].st.front()<<" ";s[i].st.pop();}cout<<endl;}}return 0;
}