POJ1700 Cross River,一道贪心题,合理选择贪心策略
:http://poj.org/problem?id=1700
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main()
{
int iCase; cin>>iCase;
while(iCase-- ){
int n; cin>>n;
vector<int> st;
for(int i = 0; i < n; ++i){
int tmp; cin>>tmp;
st.push_back(tmp);
}
sort(st.begin(), st.end());
if(st.size() == 1){
cout<<*st.begin()<<endl;
continue;
}
int time = 0;
int r1 = *(st.begin()), r2 = *(st.begin() + 1);
vector<int>::iterator iter;
while(st.size() >= 2){
if(st.size() == 2){
time += *(st.begin() + 1);
break;
}
else if(st.size() == 3){
time += *st.begin() + *(st.begin() + 1) + *(st.begin() + 2);
break;
}
iter = st.end() - 1;
int tr1 = 2*r1 + *iter + *(iter-1);//让过的最快的那个人把最慢和次慢的两个人送过去所用的时间
int tr2 = r2*2 + r1 + *iter;//让最快和次快的两个人 把 最慢和次慢的两个人送过去所用的时间
///这一阶段过后最快和此快的两个人仍未过河
time += min(tr1, tr2);
st.erase(st.end()-2, st.end());
}
cout<<time<<endl;
}
system("pause");
return 0;
}
本文出自 “东方快翔” 博客,请务必保留此出处http://hustluy.blog.51cto.com/1792080/561449