新思路!

P1983 [NOIP2013 普及组] 车站分级

蒻得不行 @ 2018-10-05 22:19:13

然鹅只有70分

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
int a[1001],p[1001],n,m,ans,s,x,y,i,j,maxx,minn;
//ans=1是因为车站等级全为0也是一种等级 \
a为离线做法的输入表\
p为模拟时各车站的等级 
int main(){
    //freopen(".txt","r",stdin);
    scanf("%d%d",&n,&m);
    while(m--){
        maxx=0;minn=1<<30;
        scanf("%d",&s);
        for(i=0;i<s;i++){
            scanf("%d",&a[i]);
            maxx=max(maxx,p[a[i]]);//临时停靠站的最大值 
        }
        for(i=1;i<s;i++) for(j=a[i-1]+1;j<a[i];j++)
            minn=min(minn,p[j]);//非临时停靠站的最小值 
        maxx-=minn-1;//因为非临时停靠站等级必须大于零时停靠站,所以-1 
        if(maxx<=0) continue;//临时停靠站与非临时停靠站相差一或更大,不矛盾,跳出 
        for(i=1;i<s;i++) for(j=a[i-1]+1;j<a[i];j++)
            p[j]+=maxx;//将所有非临时停靠站的等级置于临时停靠站的等级之上 
    }
    for(i=1;i<=n;i++) ans=max(ans,p[i]);//等级取最大值  
    printf("%d",ans+1);//因为等级下标为0,所以+1
    return 0;
}

求dalao帮忙


by outstanding_c @ 2018-10-07 12:59:09

膜拜膜拜 70分大佬


by outstanding_c @ 2018-10-07 13:01:52

#include<iostream>
using namespace std;
int n,m,a[1001][1001],r[10001],ans=0,book[1001][1001];
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++)r[i]=1;
    for(int i=1;i<=n;i++){
        cin>>a[i][0];
        for(int j=1;j<=a[i][0];j++){
            cin>>a[i][j];
            book[i][a[i][j]]=1;
        }
    }
    while(1){
        bool fl=1;
        for(int i=1;i<=n;i++){
            int maxx=0;
            for(int j=a[i][1];j<=a[i][a[i][0]];j++){
                if(book[i][j])continue;
                if(r[j]>maxx){
                    maxx=r[j];
                }
            }
            for(int j=1;j<=a[i][0];j++){
                if(r[a[i][j]]<=maxx){
                    r[a[i][j]]=maxx+1;
                    fl=0;
                }
            }
        }
        if(fl)break;
    }

    int ans=1;
    for(int i=1;i<=m;i++){
        if(r[i]>ans)ans=r[i];
    }
    cout<<ans;
    return 0;
}

by outstanding_c @ 2018-10-07 13:05:27

ac了


by 蒻得不行 @ 2018-10-17 13:58:46

(上 答 作 废)


|