Problem O

简单题意

有m辆车,每次最多运n辆过河,过河需要t时间,回来需要t时间,给出m辆车抵达岸边的时间,问使得所有车辆过河所需要的最少次数与最早时间

解题思路形成过程

最少次数当然是每次都满载运的次数当然最少,时间最早就需要考虑了,如果先满载,运完之后最后一次晕剩下的会浪费很多时间,因为剩下的车少,因此运送倒数第二批时,最后一批车辆早就到了,但还要等,但是如果先运送剩下的车辆数,再满载,这样运送时候就可以有时间让被运送的下一批车辆到达。

感想

应该多多联系实际,统筹和规划很重要

AC代码

#include <iostream>
#include <fstream>
using namespace std;
int main(){
    ifstream cin("in.txt");
    int c;
    cin>>c;
    while(c--){
        int n,t,m;
        cin>>n>>t>>m;
        int car[m+1];
        for(int i=1;i<m+1;i++){
            cin>>car[i];
        }
        int time1,time2=0,temp;
        temp=m%n;
        if(temp){
            time1=m/n+1;
        }else{
            time1=m/n;
        }
        if(temp) time2=car[temp]+t*2;
        for(int i=1;i<=m/n;i++){
            if(time2>=car[i*n+temp]){
                time2+=t*2;//如果回来的时候下一批车辆最后一辆车已经到达已经到达
            }else{
                time2=car[i*n+temp]+t*2;//否则需要等到最后一辆车到达的时间
            }
            if(i==m/n)time2-=t;//最后一次只要把最后一辆车运到对岸计算就结束,所以要减去回来的时间
        }
        cout<<time2<<" "<<time1<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值