团体程序设计天梯赛-练习集 - L1-049. 天梯赛座位分配(20 分)

简介: 团体程序设计天梯赛-练习集 - L1-049. 天梯赛座位分配(20 分)

题目链接:题目链接


题目大意:略


解题思路:模拟题(16分的天坑),16分的童鞋:关键在于,3 4 2; 3 3 4 3; 3 1 1; 观察这几组,最后一个学校的剩余的队伍的第一个队伍的第一个数据是致命点,如果是从其他学校转过来的计算开始,应该+1即可,而不是+2;如果是从当前学校转过来的计算开始,应该+2。


AC 代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int a[n],b[n],cnt[n]={0},maxn=INT_MIN,flag=1;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
            a[i]*=10;
            if(maxn<a[i])
                maxn=a[i];
        }
        if(n==1) // 1的特殊情况
        {
            printf("#1\n");
            int from=-1;
            for(int i=0;i<b[0];i++)
            {
                for(int j=0;j<10;j++)
                {
                    if(j==0)
                        printf("%d",from+=2);
                    else
                        printf(" %d",from+=2);
                }
                puts("");
            }
            continue;
        }
        sort(b,b+n);
        if(b[n-1]==b[n-2])
            flag=0;
        vector<int> v[n];
        int last=1;
        int k=1,tmax=b[n-2]*10;
        for(int j=0;j<maxn;j++)
        {
            for(int i=0;i<n;i++)
            {
                if(a[i]>cnt[i])
                {
                    cnt[i]++;
                    if(cnt[i]>tmax && flag==1)
                    {
                        if(last) // 高能!高能!16分的同学看过来,这里第一开始需要特殊处理,i.e. 3 3 1   3 3 4 3   3 4 2
                        {
                            if(k-v[i][tmax-1]!=1)
                                k--;
                            last=0;
                        }
                        k++;
                        v[i].push_back(k++);
                    }
                    else
                        v[i].push_back(k++);
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            printf("#%d\n",i+1);
            int count=0;
            for(int j=0;j<a[i];j++)
            {
                if(count==0)
                    printf("%d",v[i][j]);
                else
                    printf(" %d",v[i][j]);
                count++;
                if(count>=10)
                    puts(""),count=0;
            }
        }
    }
    return 0;
}


目录
相关文章
|
2月前
【天梯赛】L1-095 分寝室
输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);同时,每间女寝人数必须都一样,每间男寝人数必须都一样,也就是女生总人数对女寝数取模为0,男生总人数对男寝数取模为0。输入在一行中给出 3 个正整数 n0​、n1​、n,分别对应女生人数、男生人数、寝室数。按题意模拟,因为知道总寝室数为n,所以可以从1~n-1暴力枚举女寝 i 的数量,那么男寝的数量则为 c-i。
45 6
团体程序设计天梯赛-练习集L2篇⑦
团体程序设计天梯赛-练习集L2篇⑦
65 0
团体程序设计天梯赛-练习集L2篇⑨
团体程序设计天梯赛-练习集L2篇⑨
146 0
|
Perl
团体程序设计天梯赛-练习集L1篇③
团体程序设计天梯赛-练习集L1篇③
122 0
|
测试技术
团体程序设计天梯赛-练习集L2篇⑥
团体程序设计天梯赛-练习集L2篇⑥
98 0
|
测试技术 C语言 C++
PTA团体程序设计天梯赛-练习集:L1-003 个位数统计
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。 输入格式: 每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。 输出格式: 对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
177 0
L1-079 天梯赛的善良 (20 分)
L1-079 天梯赛的善良 (20 分)
210 0
PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
161 0
7-7 天梯赛的善良 (20 分)
7-7 天梯赛的善良 (20 分)
268 0
团体程序设计天梯赛-练习集 - L2-028 秀恩爱分得快(25 分)
团体程序设计天梯赛-练习集 - L2-028 秀恩爱分得快(25 分)
249 0