1 条题解

  • 0
    @ 2025-5-23 14:43:27

    解题思路

    1. 问题分析

      • 渡船的长度为 ll 米,但汽车的长度以厘米给出,需要统一单位(11=100= 100 厘米)。
      • 渡船初始在左岸,且只有在有汽车等待或渡船上有汽车时才会移动。
      • 每次渡船到达一岸时,会尽可能多地装载该岸等待的汽车(按到达顺序),只要它们的总长度不超过渡船的容量 l×100l \times 100 厘米。
      • 每次从一岸到另一岸的移动算作一次“穿越”(crossing),包括去和回。
    2. 关键点

      • 需要维护两个队列,分别表示左岸和右岸等待的汽车。
      • 渡船的当前方向(左或右)影响装载的汽车。
      • 每次穿越后,渡船的方向会反转。
      • 统计穿越次数时,每次从一岸到另一岸算作一次穿越(即使空载)。

    代码实现

    #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
    上传者