`
luotuoass
  • 浏览: 641986 次
文章分类
社区版块
存档分类
最新评论

过桥时间最短的算法实现(TopCoder)

 
阅读更多

问题描述:

一群人晚上过桥,每次只能过2个人,并且需要一盏灯。每个人过桥时间不同。计算最短时间

给出是过桥时间如{1,2,5,10},计算出最小时间17

首先 1,2 过去 时间 2

1 回来 时间 1

5,10 过去 时间 10

2 回来 时间2

1,2过去 时间 2

总共 17

未过一方:小 大 小 大。。。。。

过去一方 小 小 小。。。。

我自己的是按照这个流程作:但是感觉效率很低,大家有什么好的思路或者这个思路的效率高的方法;

#include <vector>
#include <algorithm>
#include <iostream>
#include <set>
#include <iterator>
using namespace std;

class BridgeCrossing
{
public:
int minTime(vector <int> times)
{

//if (times.size() <= 1) {
//return times[0];
//}
//int persons = times.size();
//vector<int> left(times.begin(), times.end());
//vector<int> right(persons, 0);
//int mintime = 0;
//int lp = persons;
//int tmp = 0;

//sort(left.begin(), left.end());
//while (lp > 0) {
//right[0] = left[0]; lp--;
//right[1] = left[1]; lp--;
//mintime += left[1];
//if (lp <= 0)
//return mintime;

//mintime += right[0]; lp++;

//right[persons - (2*tmp + 1)] = left[persons - (2*tmp + 1)]; lp--;
//right[persons - (2*tmp + 2)] = left[persons - (2*tmp + 2)]; lp--;
//mintime += left[persons - (2*tmp + 1)];
//if (lp <= 0)
//return mintime;

//mintime += right[1]; lp++;
//tmp++;
//}

if(times.size()==1)
return times[0];
multiset<int> left(times.begin(),times.end());
multiset<int> right;
int mintime=0;
unsigned persons = left.size();
//cout<<"end"<<endl;
//copy(left.begin(),left.end(),ostream_iterator<int>(cout," "));

cout<<endl;
while(persons>0)
{
int time=0;
multiset<int>::iterator iter = left.begin();
//左边2个
//第一个
time=*iter;
iter=left.erase(iter);persons--;
right.insert(time);
//第二个
time=*iter;
iter=left.erase(iter);persons--;
mintime+=time;
right.insert(time);

if(persons<=0)
return mintime;
//从右边过来一个最小的
iter = right.begin();
time=*iter;
iter=right.erase(iter);
mintime+=time;
left.insert(time);persons++;

//左边两个最大的
iter = left.end();
//第一个
time = *(--iter);
mintime+=time;
iter=left.erase(iter);
right.insert(time);persons--;
//第二个
iter--;
time= *iter;
iter=left.erase(iter);
right.insert(time);persons--;
if(persons<=0)
return mintime;

//从右边过来一个最小的
iter = right.begin();
time=*iter;
iter=right.erase(iter);
mintime+=time;
left.insert(time);persons++;

}

return mintime;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
int a[] = { 1, 2, 3, 50, 99, 100 };
vector<int> arg(a, a + sizeof(a)/sizeof(a[0]));

BridgeCrossing bc;
cout << bc.minTime(arg) << endl;

return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics