poj1700--贪心算法
题意:一群人坐船过河,船只有一辆,且一次最多坐两人,时间按慢的算。求最短过河时间?
总共有两种做法可使用:
1.先让最快和次快的过去,让最快的把船开回,再让最慢和次慢的过去,让次快的把船开回。需两个来回可将最慢和次慢过河。
2.让最快带着最慢过河,最快将船开回,再让最快带着次慢过河,最快将船开回。也是两回合将最慢和次慢过河。
每两个来回可判断哪种方法最快,将最快的相加。
#include<iostream> #include<algorithm> using namespace std; int main(){ int n,m; cin>>n; while(n--){ int a[1001],sum=0,res1,res2,i=0; cin>>m; for(i=0;i<m;i++) cin>>a[i]; sort(a,a+m); for(i=m-1;i>2;i-=2){ res1=a[1]*2+a[0]+a[i]; res2=a[0]*2+a[i]+a[i-1]; if(res1>res2) sum+=res2; else sum+=res1; } if(i==2) sum+=a[2]+a[1]+a[0]; else sum+=a[i]; cout<<sum<<endl; } }