北京林业大学“计蒜客”杯程序设计竞赛 网络赛 乘电梯

题目回忆版:
小白乘电梯,大楼里有n部电梯可用,小白在第m层,已知每部电梯有它的换乘楼层,也就是经过的楼层会停下来,已知电梯每上升一层或下降一层耗时5秒,停在某一层耗时15秒,求小白需要等待的时间。
【数据】:
input
3 5
2 10 20
3 4 5 6
0
2 7 9
ouput
30 25 105
【思路】:
将可用电梯与当前楼层区间有换乘的楼层标记即可
【代码】:

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
const int maxm = 55;
const LL MOD = 999999997;
inline LL read()
{
    int  c=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        c=c*10+ch-'0';
        ch=getchar();
    }
    return c*f;
}
int c[maxm],Map[maxm][maxm],Save[maxm*maxm][4];

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

int Eular(int n)
{
    int ret =1;
    for(int i=2; i*i<=n; ++i)
    {
        if(n%i==0)
        {
            ret *= (i-1);
            n/=i;
            while(n%i==0)
            {
                ret*=i;
                n/=i;
            }
        }
    }
    if(n>1) ret*=(n-1);
    return ret;
}

int Get_divisor_sum(int n)
{
    int sum=0;
    for(int i=2; i*i<=n; ++i)
    {
        if(n%i==0)
        {
            sum+=i;
            if(n/i!=i) sum+=n/i;
        }
    }
    sum++;
    return sum;
}

LL Quick_Mod(LL a,LL b,LL MOD)
{
    LL ans=a,ret=1;
    while(b)
    {
        if(b&1) ret = ret*ans%MOD;
        b>>=1;
        ans=ans*ans%MOD;
    }
    return ret;
}
struct node
{
    int idx,sum;
} lc[1000];
int main()
{
    int n,m;
   // freopen("1.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1; i<=n; i++) lc[i].idx=read();
        int ans[1000],v,x;
        for(int j=1; j<=n; j++)
        {
           v=read();
            int tp[1000]= {0};
            for(int k=1; k<=v; k++)
            {
                x=read();
                tp[x]=1;
            }
            int sum=0;
            if(lc[j].idx>m)
            {
                for(int ll=lc[j].idx-1; ll>m; --ll)
                {
                    if(tp[ll]) sum+=15;
                }
                sum+=(lc[j].idx-m)*5;
            }
            else if(lc[j].idx<m)
            {
                for(int ll=lc[j].idx+1; ll<m; ++ll)
                {
                    if(tp[ll]) sum+=15;
                }
                sum+=(m-lc[j].idx)*5;
            }
            else sum=0;
            lc[j].sum=sum;
        }
        for(int i=1; i<n; i++)
            printf("%d ",lc[i].sum);
        printf("%d\n",lc[n].sum);
    }
    return 0;
}

你可能感兴趣的:(模拟)