Timus 1826

系统 1390 0
      
        #include 
      
      
        <
      
      
        iostream
      
      
        >
      
      
        
#include
< vector >
#include
< algorithm >
using namespace std;

int main() {

vector
< int > times;
int n, min = 0 , t, t1, t2;

cin
>> n;

for ( int i = 0 ;i < n;i ++ ) {
cin
>> t;
times.push_back(t);
}

sort(times.begin(), times.end());

for ( int i = times.size() - 1 ; i >= 3 ; i -= 2 ) {
t1
= times[ 1 ] + times[ 0 ] + times[i] + times[ 1 ];
t2
= times[i] + times[ 0 ] + times[i - 1 ] + times[ 0 ];

if ( t1 <= t2 ) {
times.pop_back();
times.pop_back();
min
+= t1;
}
else {
break ;
}
}

for ( int i = times.size() - 1 ; i > 1 ; i -- ) {
min
+= times[i] + times[ 0 ];
times.pop_back();
}

if (times.size() == 2 )
min
+= times[ 1 ];
else
min
+= times[ 0 ];

cout
<< min << endl;

return 0 ;
}

咋看题意,比较单纯的我就以为每次只要用最快的人带另一个人过去对面,然后回来,这样就是最短时间。

但作者人很好,因为他在示例数据里面已经告诉所有像我那样单纯的人,这样的想法是不对的。

然而实在太单纯了,竟然不知道示例数据是如何计算出来的,唯有去看discuss了。

看过了以后知道了,如果有两个人,他们过对面花费的时间都很大,那么把这两个人捆绑一齐送过去,然后再把对面一个走得很快的人回来,这样可能更好。

明白了这一点后,我第一个反应就是DP,谁知道这题的DP是2^100 (n<=100),我知道自己又错了。

后来想了一下,只要总是比较一种情况,迭代到最后就可以了。

假设按耗时从低到高来排序所有人,那么得到序列T0,T1,...,Tn-2,Tn-1

那么到底把两个走得慢的人捆绑到对面,再送一个“快人”回来的优势有多大呢?算一下就好,取哪两个“慢人”好呢?当然是最慢的。

T1(两个“快人”过去) + T0(最快的人回来)+ Tn-1(最慢两人过去) + T1(次快的人回来)

然后就这样把两个最慢的人送过去了,而常规的,用最快的人分别送这两个慢人过去的计算就不说了。 比较一下就知道哪个方案的优势高。

如果对最慢的两个人都失去优势,那么对其他剩下的人也是。

Timus 1826


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论