题解:CF2051B Journey
分析
-
周期计算:
- 计算一个完整周期内的总距离:
S=a+b+c 。
- 计算一个完整周期内的总距离:
-
计算完整周期的数量:
- 计算
n 里面有多少个完整周期:k = \left\lfloor \frac{n}{S} \right\rfloor 。 - 所需的天数为
3k 天。
- 计算
-
处理剩余距离:
- 计算剩余的距离:
r = n - k \times S 。 - 如果剩余的距离
r>0 ,则会有额外的天数。 - 从周期的第一天开始,依次检查
a,b, c ,直到算出额外天数。
- 计算剩余的距离:
-
特殊情况:
- 如果
n 正好是完整周期的倍数,则不计算额外天数。
- 如果
-
剩余距离处理:
- 如果
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";
}
}