贪心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;
}