B3768 [语言月赛202305] 独行题解
Source & Knowledge
2023 年 5 月语言月赛,由洛谷网校入门计划/基础计划提供。
题目大意
一艘船以
题目分析
这一题的题面比较长,考察问题理解能力和代码实现能力。
(结尾有彩蛋)。
首先,我们快速地抓住题目大意。大致可以分为以下几步进行:
第一步,我们要知道这道题从最宏观的角度是在要求我们做什么。在这题中,就是一艘船要行驶到目的地,在中途会出现掉头的事件。
第二步,理清每个变量的含义。在这道题中,主要的变量有这些:
第三步,理清各个变量之间的逻辑关系,在脑子里尝试简化题意。这一步做完,一道题的大意就能被你掌握了!
接下来就要解决这个题目了。由于船只有向前和向后两个方向,而且方向相同的一段时间内速度是相等的,而这两种状态的分界就是思念的起止时间——向前的时间就是每一次思念结束到下一次思念开始之间,向后的时间就是每次思念开始到这次思念结束。所以我们可以按照
对于输出,就是按照
这是输出部分:
void print(int t){
int day=(t/86400)+1;//因为是4月1日开始,所以日期要加一
t%=86400;
int hor=(t/3600);
t%=3600;
int m=t/60;
t%=60;
pf("202304%02dat%02d:%02d:%02d",day,hor,m,t);
}
这是处理部分:
T[n+1]=2100000000;
while(1){
nowt=T[++tmp];
if(dis+(ll)(nowt-pret)*v>=S){//如果像我一样是增加一个inf的时间,要注意乘法可能超出int范围
int extra=((S-dis)%v!=0);
print((S-dis)/v+extra+pret);
return 0;
}
dis+=(nowt-pret)*v;
dis=max(0,dis-v1*t1);//如果掉头时到了家乡会停下
pret=nowt+t1;
v1+=v2,t1+=t2;
}