题解 P1983 【车站分级】

· · 题解

暴力大法好

下面给出我各个变量的解释

#include<bits/stdc++.h>//懒人专用头文件
#define max(x,y) ((x)>(y)?(x):(y))
#define rpt(n) for(register int ttxyc=0;ttxyc<(n);++ttxyc)//宏定义
using namespace std;
inline int read()//快读
{
    register int x=0,t=0;register char c=getchar();for(;c<'0'||c>'9';t|=c=='-',c=getchar());
    for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^48),c=getchar());return t?-x:x;
}
int n,m,a[1000],f[1000][1000],s[1000];bool have[1000][1000];
main()
{
    n=read();m=read();
    rpt(n)a[ttxyc]=1;
    rpt(m)
    {
        s[ttxyc]=read();
        for(register int i=0;i<s[ttxyc];++i)f[ttxyc][i]=read()-1,have[ttxyc][f[ttxyc][i]]=1;
    }
    //以上均为输入
    for(;;)//屎循环
    {
        bool cd=0;//是否更改
        rpt(m)
        {
            int maxn=0;
            for(register int i=f[ttxyc][0];i<=f[ttxyc][s[ttxyc]-1];++i)
                if(!have[ttxyc][i])maxn=max(maxn,a[i]);//不停靠的取最大值
            ++maxn;//停靠的比不停靠的至少多一
            for(register int i=0;i<s[ttxyc];++i)
                if(a[f[ttxyc][i]]<maxn)a[f[ttxyc][i]]=maxn,cd=1;//有的分级不符合要求,更改
        }
        if(!cd)break;//没更新的就说明已经是最优解
    }
    int maxn=0;
    rpt(n)maxn=max(maxn,a[ttxyc]);
    printf("%d",maxn);
}