1 条题解
-
0
自动搬运
来自洛谷,原作者为

Math_rad_round
旋转卡壳有2^4种读法,你知道吗?||NOIP退役苕皮搬运于
2025-08-24 22:22:23,当前版本为作者最后更新于2020-06-14 10:17:08,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意简述
一条长为的线上有个点。每个点都以每秒移动一个单位的速度向前,
当迎面碰到另一个点时,立即掉头并继续向前。确定每个点离开绳子所用时间。
,所有点的位置和初始方向按位置升序给出
这种“ 相遇掉头并继续向前 ”问题,你可以假装你拿着望远镜在远处看
当你看到两个点相遇时,因为你区分不出每一个点,所以你只是会以为两个点 穿 了过去
例如原本有两个点 右,左
相遇时过了秒,此时 右,左
掉头, 此时 左,右
再过秒,此时 左,右
如果把反转, 就是 左,右
而如果直接穿过—— 左,右
所以如果有右,那秒后一定有一个点右
同时,因为不可能互相穿过,所以每个点的顺序一定不会改
比如一开始在左边紧邻,那永远都在左边紧邻
所以我们只要处理出
左边有点到达的时间,从小到大配对给左边的若干个点,
右边有点到达的时间,从大到小配对给接下来的点,
AC代码:
#include<iostream> using namespace std; int a[100001]; int b[100001]; int c[100001]; int main(){ int n,l; cin>>n>>l; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ cin>>b[i]; } int h=0; for(int i=1;i<=n;i++){ if(b[i]==0){//左边到达 cout<<a[i]<<" "; } } for(int i=1;i<=n;i++){ if(b[i]==1){//右边到达 cout<<l-a[i]<<" "; } } }
谢谢观赏!
- 1
信息
- ID
- 5641
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者