题解:CF2051B Journey

· · 题解

分析

  1. 周期计算

    • 计算一个完整周期内的总距离: S=a+b+c
  2. 计算完整周期的数量

    • 计算 n 里面有多少个完整周期: k = \left\lfloor \frac{n}{S} \right\rfloor
    • 所需的天数为 3k 天。
  3. 处理剩余距离

    • 计算剩余的距离: r = n - k \times S
    • 如果剩余的距离 r>0,则会有额外的天数。
    • 从周期的第一天开始,依次检查 a,b, c ,直到算出额外天数。
  4. 特殊情况

    • 如果 n 正好是完整周期的倍数,则不计算额外天数。
  5. 剩余距离处理

    • 如果 r=0,则不需要额外天数。
    • 否则,依次查询 a,b,c,直到找到满足 r\leq 当前步数的步数。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main(){
    cin>>t;
    while(t--){
        ll n,a,b,c;
        cin>>n>>a>>b>>c;
        ll S=a+b+c;    //计算一个完整周期
        ll k=n/S;   //计算完整周期的数量
        ll r=n-k*S;   //计算剩余的距离
        ll days=3*k;   //初始天数为3k
        if(r==0){
            //不需要额外天数
        }
        else{
            if(r<=a){
                days+=1;
            }
            else if(r<=a+b){
                days+=2;
            }
            else{
                days+=3;
            }
        }
        cout<<days<<"\n";
    }
}