CF725B 题解

Peter0701

2019-07-20 09:14:22

Solution

观察题目条件,容易发现乘务员的服务以四排为一个循环,如 $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$ 秒。 那么这题就完美结束了,如有疑问,评论区见! 代码如下: ```cpp #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; } ```