一种神(xia)奇(ji)的(ba)的解(pian)法(fen)70

P1983 [NOIP2013 普及组] 车站分级

HMTD @ 2017-10-31 15:29:33

因为只要停靠了一个车站x,辣么比他优先级高的车站都要停靠

so,每一组车次信息中,停靠的那些站一定比没有停靠的级别高

所以开一个bool矩阵(axiaob),axiaob[i][j]=true代表i站比j优先级低

每次读入车次信息,都经过(瞎)分析后填入矩阵。

坠后江每一行矩阵true的个数进行加和,因为true的越多证明它比越多的站低级。

也就是它越低级。

然后我们统计一下一共加出来了几种(注意不是几个)和。

输出,骗到70。

↓下面是代码↓

#include<bits/stdc++.h>
using namespace std;
inline int readd()
{
    int ans=0;
    char a;
    bool fu=false;
    while(a=getchar(),a<'0'||a>'9')
        if(a=='-')
            fu=true;    
    do
    {
        ans=ans*10+int(a-'0');
    }while(a=getchar(),a>='0'&&a<='9');    
    if(fu)
        return -ans;
    else
        return ans;

}//快读

bool axiaob[1001][1001];
bool roadd[1001];
int ord[1001];
int tj[1001];
int main()
{
    //freopen("level.in","r",stdin);
    //freopen("level.out","w",stdout);
    int n,m;
    cin>>n>>m;
    int stop;int num;
    int l=10000,r=0;
    for(int i=1;i<=m;i++)
    {
        l=10000,r=0;
        cin>>num;
        for(int j=1;j<=num;j++)
        {
            cin>>stop;
            roadd[stop]=true;
            if(stop<l)
                l=stop;
            if(stop>r)
                r=stop;
        }
        for(int j=l;j<=r;j++)
        {
            if(roadd[j])
                for(int k=l;k<=r;k++)
                    if(!roadd[k])
                        axiaob[k][j]=true;
        }
        memset(roadd,0,sizeof(roadd));
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(axiaob[i][j])
                ord[i]++;
    int pin=1;
    int total=0;
    memset(tj,-1,sizeof(tj));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<pin;j++)
            if(tj[j]==ord[i])
                goto linee;
        tj[pin]=ord[i];
        pin++;
        total++;            
        linee:;
    }
    cout<<total;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

by Kaizyn @ 2018-07-26 14:47:25

我也是这样想的欸

去觉得真是天衣无缝

然而剩下三十分呢?


by Kaizyn @ 2018-07-26 14:50:32

第6,9,10个数据点


by 王江睿 @ 2022-08-01 15:22:12

+1


|