[转载] $CF725B$ 题解

阅读原文

观察题目条件,容易发现乘务员的服务以四排为一个循环,如 \(1+3 \rightarrow 2+4 \rightarrow 5+7 \rightarrow 6+8\) 就是两个循环。在每个循环中,乘务员只移动一次。在每个循环中,乘务员共移动两次次。具体来说,从每个循环中 \(mod\) \(4\) \(==\) \(1\) 的一排前进到 \(mod\) \(4\) \(==\) \(2\) 的一排需要花费 \(1\) 秒,而从每个循环中 \(mod\) \(4\) \(==\) \(2\) 的一排前进到下一个循环 \(mod\) \(4\) \(==\) \(1\) 的一排时需要花费 \(3\) 秒。

那么这题就可以通过分类讨论的方式解决,可以按照排数 \(n\) 分为以下四类:

情况一: \(n\) \(mod\) \(4\) \(==\) \(1\) 时,已经经过了 \((n-1)/4\) 个循环,每个循环开始到下一个循环之前共用了 \(4×6/2+1+3=16\) 秒,故在第 \(n\) 排服务之前总计用了 \((n-1)/4×16=n×4-4\) 秒钟,再对第 \(n\) 排每个座位加上相应的服务时间即可。

情况二: \(n\) \(mod\) \(4\) \(==\) \(2\) 时,已经经过了 \((n-2)/4\) 个循环,每个循环开始到下一个循环之前共用了 \(4×6/2+1+3=16\) 秒,又因为在第 \(n-1\) 排服务时花费了 \(6×1=6\) 秒,从第 \(n-1\) 排走到第 \(n\) 排花费了 \(1\) 秒,故在第 \(n\) 排服务之前总计用了 \((n-2)/4×16+6+1=n×4-1\) 秒钟,再对第 \(n\) 排每个座位加上相应的服务时间即可。

情况三: \(n\) \(mod\) \(4\) \(==\) \(3\) 时,已经经过了 \((n-3)/4\) 个循环,每个循环开始到下一个循环之前共用了 \(4×6/2+1+3=16\) 秒,故在第 \(n\) 排服务之前总计用了 \((n-3)/4×16=n×4-12\) 秒钟,再对第 \(n\) 排每个座位加上相应的服务时间即可。

情况四: \(n\) \(mod\) \(4\) \(==\) \(0\) 时,已经经过了 \((n-4)/4\) 个循环,每个循环开始到下一个循环之前共用了 \(4×6/2+1+3=16\) 秒,又因为在第 \(n-1\) 排服务时花费了 \(6×1=6\) 秒,从第 \(n-1\) 排走到第 \(n\) 排花费了 \(1\) 秒,故在第 \(n\) 排服务之前总计用了 \((n-4)/4×16+6+1=n×4-9\) 秒钟,再对第 \(n\) 排每个座位加上相应的服务时间即可。

再具体说明一下对第 \(n\) 排每个座位加上相应的服务时间的方法:根据题意和题图,服务总是由窗口方向向过道方向进行,又因为题目规定先进行(面向前排方向)右边座位的服务,因此对于每一排来说,服务总是以 \(f \rightarrow e \rightarrow d \rightarrow a \rightarrow b \rightarrow c\) 的顺序进行的。因此读入座位号的字母为 \(f\) 时,总服务时间要加上 \(1\) 秒,读入座位号的字母为 \(e\) 时,总服务时间要加上 \(2\) 秒,读入座位号的字母为 \(d\) 时,总服务时间要加上 \(3\) 秒,读入座位号的字母为 \(a\) 时,总服务时间要加上 \(4\) 秒,读入座位号的字母为 \(b\) 时,总服务时间要加上 \(5\) 秒,读入座位号的字母为 \(c\) 时,总服务时间要加上 \(6\) 秒。

那么这题就完美结束了,如有疑问,评论区见!

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,wt;
char s;
int main()
{
    scanf("%lld",&n);
    scanf("%c",&s);
    if(n%4==1)
    {
        wt=n*4-4;
        if(s=='f')
            wt++;
        else if(s=='e')
            wt+=2;
        else if(s=='d')
            wt+=3;
        else if(s=='a')
            wt+=4;
        else if(s=='b')
            wt+=5;
        else if(s=='c')
            wt+=6;
    }
    else if(n%4==2)
    {
        wt=n*4-1;
        if(s=='f')
            wt++;
        else if(s=='e')
            wt+=2;
        else if(s=='d')
            wt+=3;
        else if(s=='a')
            wt+=4;
        else if(s=='b')
            wt+=5;
        else if(s=='c')
            wt+=6;
    }
    else if(n%4==3)
    {
        wt=n*4-12;
        if(s=='f')
            wt++;
        else if(s=='e')
            wt+=2;
        else if(s=='d')
            wt+=3;
        else if(s=='a')
            wt+=4;
        else if(s=='b')
            wt+=5;
        else if(s=='c')
            wt+=6;
    }
    else
    {
        wt=n*4-9;
        if(s=='f')
            wt++;
        else if(s=='e')
            wt+=2;
        else if(s=='d')
            wt+=3;
        else if(s=='a')
            wt+=4;
        else if(s=='b')
            wt+=5;
        else if(s=='c')
            wt+=6;
    }
    printf("%lld\n",wt);
    return 0;
}

转载于:https://www.cnblogs.com/Peter0701/p/11288503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值