1 条题解
-
0
解题思路
-
问题分析:
- 渡船的长度为 米,但汽车的长度以厘米给出,需要统一单位( 米 厘米)。
- 渡船初始在左岸,且只有在有汽车等待或渡船上有汽车时才会移动。
- 每次渡船到达一岸时,会尽可能多地装载该岸等待的汽车(按到达顺序),只要它们的总长度不超过渡船的容量 厘米。
- 每次从一岸到另一岸的移动算作一次“穿越”(crossing),包括去和回。
-
关键点:
- 需要维护两个队列,分别表示左岸和右岸等待的汽车。
- 渡船的当前方向(左或右)影响装载的汽车。
- 每次穿越后,渡船的方向会反转。
- 统计穿越次数时,每次从一岸到另一岸算作一次穿越(即使空载)。
代码实现
#include <iostream> #include <string> using namespace std; int ans[2],s,n,s1[2],x,_; string st; int main(){ cin>>_; while(_--){ ans[0]=ans[1]=0;//代表次数 s1[1]=s1[0]=0;//当前船剩余的长度 cin>>s>>n; s*=100;//读入船的长度是米,车的长度是厘米 for(int i=1;i<=n;i++){ int y; cin>>x>>st; if(st=="left")y=1;//左边是0,右边是1,分开处理 else y=0; if(s1[y]+x<s)s1[y]+=x;//尽量运多的车 else ans[y]++,s1[y]=x; } if(s1[1])ans[1]++; if(s1[0])ans[0]++; if(ans[0]<ans[1]-1)ans[0]=ans[1]-1;//求次数 if(ans[1]<ans[0])ans[1]=ans[0]; cout<<ans[0]+ans[1]<<endl;//最后的答案就是两种次数之和 } }
-
- 1
信息
- ID
- 2283
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者