贪心题解(货物运输)POJ 2336

本文介绍了一道关于运输问题的贪心算法题,通过优化运输次数和时间,解决了多个货物同时到达的情况,确保了最高效的运输方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心w题
题目大意:目前有一个运输工具,他往返于A,B两点,A到B之间单程花费时间t,现在有m个货物需要运输,每个货物都有到达的时间,问你,最少运输时间和基于此时间最少的运输次数
思路:啊啊啊啊,我的魔鬼思路
我一开始一看,诶,只要最后一个到了的时候是他刚来就走就行了(口齿不清),也就是说是最后一个的时间+t,然后运输次数也简单,然后每次运输最多的不就完事了。
艹我没想到他还能有一大堆货物一块来,说的也是,,如果我这都能AC我真是看不起这个题
WA搞笑代码

正确思路:如果m%n=0,让每次都运输n个货物就好,这样就能保证最后一个货物是在他到达的是就出发进行运输,
如果无法满足m%n=0那么就让第一次运输m%n个货物然后再让之后的每次运输n个货物,这样还是可以保证最后一个货物在他到达的时候就马上被运输。
那么刚才的同一时间来一大堆的货物问题就被解决了
具体请我们看代码与注释

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int t;
    for(cin>>t;t;t--)
    {
        int n,t,m,a[1450],time=0,cars=0,counts=0;
        cin>>n>>t>>m;
        for(int i=0;i<m;i++)
        {
            cin>>a[i];
        }
        sort(a,a+m);
        time=a[m-1]+t;
        if(m%n)
        {
            counts=m/n+1;
        }
        else
        {
            counts=m/n;
        }
        cout<<time<< " " <<counts<<endl;
    }

    return 0;
}

AC代码:

#include <iostream>

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,t,m;
       cin>>n>>t>>m;
        int L = m%n/*决定第一次的运输货物*/, k = m/n/*决定运输的次数*/;
        int time = 0/*时间基线*/,arrive/*每个货物到达的时间*/,counts = k/*运输的次数*/;
        if(L)/*如果m%n不是0*/
        {
            counts++;/*因为下方一共运输k=m/n次所以在这里运输次数加一*/
            for (int i = 0; i < L/*运输m%n个*/; i++)
                {
                  cin>>arrive;
                }
            time += arrive + 2*t;
        }
/*上方操作就是,假如m%n!=0那么第一次运m%n个,然后搞出这个时间,*/
/*下方就是每次运n个*/
        for (int i = 0; i < k; i++)
        {
            for(int j=0;j<n;j++)
                {
                cin>>arrive;
                }
            if(time > arrive)/*时间基线已经大于这个货物的到达时间了,证明这次的n个货物已经可以全部开始运输了*/
                {
                 time += 2*t;/*已经满载了*/
                }
            else
             {
                time = arrive + 2*t;/*如果没有到这次的第n个货物出发的时间,那么就等到,所以加了一个arrive*/
             }
        }
        cout<<time-t<< " " <<counts<<endl;

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值