【PTA】7-9 天梯赛座位分配

题目重述

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

输入格式:

输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

输出格式:

从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

输入样例:

3
3 4 2

输出样例:

#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60

题解

就拿样例来说,给了三个学校,从1开始,轮番给这三个学校分配编号,如果有一个学校每个人都有了号,以后就不再给这个学校了。

需要注意的是:

  1. 额外判断当初始就只有一个学校的时候,这时候可以让起始id从-1开始,具体可以看代码。
  2. 当只剩下一个学校的时候,让他们隔开坐,也就是需要编号之间相隔2。

C++ AC代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int M[110];
    int N;
    vector<int> vs[110];
    cin>>N;
    //cnt初始为:还有几个学校未分配完
    int cnt=N;
    int cnt_tp=0;
    //标识哪个学校已经分配完了,默认都没有
    bool flag[110];
    memset(flag,0,sizeof(flag));
    for(int i=1; i<=N; i++)
    {
        cin>>M[i];
        M[i]*=10;
        cnt_tp+=M[i];

    }
    int id=0;
    if(N==1)
    {
        id=-1;
    }
    //总体while循环
    while(cnt_tp--)
    {
        for(int i=1; i<=N; i++)
        {
            //如果这个学校还没分配完
            if(M[i]!=vs[i].size())
            {
                if(cnt==1)
                {
                    id+=2;
                }
                else
                {
                    id++;
                }
                vs[i].push_back(id);
            }
            //已分配完的学校
            else
            {
                //如果这个学校的标识还是false,cnt--
                if(!flag[i])
                {
                    cnt--;
                    flag[i]=true;
                }
            }
        }

    }
    //输出元素
    for(int i=1; i<=N; i++)
    {
        cout<<"#"<<i<<endl;
        for(int j=0; j<vs[i].size(); j++)
        {
            if(j%10==0&&j!=0)cout<<endl;
            if(j%10!=0)cout<<" ";
            cout<<vs[i][j];
        }
        cout<<endl;
    }

    return 0;
}

发布了196 篇原创文章 · 获赞 99 · 访问量 4万+
展开阅读全文

PTAL1-049 天梯座位分配 题目 打印正确但是评测显示错误

02-28

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略: 假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队, 第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。 输入格式: 输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数, 数字间以空格分隔。 输出格式: 从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。 另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。 输入样例: 3 3 4 2 输出样例: #1 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 63 65 67 69 71 73 75 77 79 #2 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 #3 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 思路是看有多少学校,打印出一个队伍,与此同时其他学校各减少一个队伍,不断循环。直到自己学校队伍打印完。 ``` #include <stdio.h> #include <string.h> int main() { int n,m=0; int team[105],teams[105]; int seat =1,a; int i,j,k,l; scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d",&team[i]); } for(i=0; i<n; i++) { for(l=0; l<n; l++) { teams[l]=team[l]; } printf("#%d\n",i+1); seat=i+1; while(teams[i]) { m=0; //统计现有学校数目; for(j=0; j<n; j++) { if(teams[j]!=0) m++; } //然后打印 if(m==1){ for(k=0; k<9; k++) { printf("%d ",seat++); seat+=m; } printf("%d",seat++);} else { for(k=0; k<9; k++) { printf("%d ",seat); seat+=m; } printf("%d",seat); seat+=m; } printf("\n"); for(j=0; j<n; j++) { if(teams[j]!=0) teams[j]--; } } } } ``` ![图片说明](https://img-ask.csdn.net/upload/201902/28/1551361097_561957.png) ![图片说明](https://img-ask.csdn.net/upload/201902/28/1551361165_379993.png) 问答

C语言 PTA 深度优先搜索 搜座位

11-10

[原题地址](https://pta.patest.cn/pta/test/2067/exam/4/question/27788 "") 5-3 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。 输入格式: 输入第一行给出3个正整数:N(≤\le≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾客编号。 这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。 输出格式: 对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem;如果他们之间并不是朋友,但也不敌对,则输出OK;如果他们之间有敌对,然而也有共同的朋友,则输出OK but...;如果他们之间只有敌对关系,则输出No way。 输入样例: 7 8 4 5 6 1 2 7 -1 1 3 1 3 4 1 6 7 -1 1 2 1 1 4 1 2 3 -1 3 4 5 7 2 3 7 2 输出样例: No problem OK OK but... No way ``` #include <stdio.h> #define MAXSIZE 100 int G[MAXSIZE][MAXSIZE]={{0}},Nv,Ne,K,visited[MAXSIZE],friends,enemy,v1,v2,result[MAXSIZE]; void DFS(int v) { int i; visited[v]=1; if(v==v2) { return ; } for(i=1;i<=Nv;i++) { if((G[v][i]==1)&&visited[i]==0) { DFS(i); } } } void BuildGraph() { int i,j,v1,v2,weight; scanf("%d %d %d",&Nv,&Ne,&K); for(i=0;i<Ne;i++) { scanf("%d %d %d",&v1,&v2,&weight); G[v1][v2]=G[v2][v1]=weight; } } int main() { int i,j; BuildGraph(); for(i=0;i<K;i++) { friends=0; enemy=0; for(j=1;j<=Nv;j++) { visited[j]=0; } scanf("%d %d",&v1,&v2); if(G[v1][v2]==1) { result[i]=1; continue; } if(G[v1][v2]==-1) { DFS(v1); if(visited[v2]==1) { result[i]=3; } else { result[i]=4; } } if(G[v1][v2]==0) { DFS(v1); if(visited[v2]==0) { result[i]=2; } else { result[i]=1; } } } for(i=0;i<K;i++) { switch(result[i]) { case 1:printf("No problem\n");break; case 2:printf("OK\n");break; case 3:printf("OK but...\n");break; case 4:printf("No way\n");break; } } return 0; } ``` 测试点有两个通不过,请问错在哪里? 我的思路:如果关系=0,搜朋友 ,搜朋友,如果搜到就是朋友,没搜到就是不是朋友也不是敌人;如果关系=1,是朋友;如果关系=-1,搜朋友,如果搜到了就是敌对关系但是有共同的朋友,如果没搜到就是单纯的敌对关系。 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览