首页 > 代码库 > poj - 1700 题解
poj - 1700 题解
大概题意:N个人要过河,一个船最多承载两人,且过河速度等于船上划船速度最慢的人的速度,求过河的最短时间。
题目解法:首先对题目进行分析,可以发现:船过了河还要有一个人再把船送回来。
假设把人按过河速度从大到小排序并编号1-4,则会发现有两种过河方式:1.13一组,1回来,24一组,2回来,12一组,完成;2.12一组,1回来,13一组,1回来,14一组,完成。
因此贪心策略就是:把人按过河速度从大到小排序,然后按上述方式过河,每次选取最优方式。
代码如下:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int a[1001]; 5 bool com(const int& x,const int& y) 6 { 7 return x<y; 8 } 9 int main() 10 { 11 int T; 12 cin>>T; 13 for(int t=1;t<=T;t++) 14 { 15 int n; 16 cin>>n; 17 for(int i=1;i<=n;i++) 18 { 19 cin>>a[i]; 20 } 21 sort(a+1,a+n+1,com); 22 if(n==1) 23 { 24 cout<<a[1]<<endl; 25 continue; 26 } 27 if(n==2) 28 { 29 cout<<a[2]<<endl; 30 continue; 31 } 32 if(n==3) 33 { 34 cout<<a[2]+a[1]+a[3]<<endl; 35 continue; 36 } 37 int res=a[2]; 38 int tip=n; 39 if(n%2==0) 40 { 41 while(tip>=4) 42 { 43 int t1=a[1]+a[2]+a[2]+a[tip]; 44 int t2=a[tip]+a[1]+a[tip-1]+a[1]; 45 res+=min(t1,t2); 46 tip-=2; 47 } 48 } 49 else 50 { 51 while(tip>=5) 52 { 53 int t1=a[1]+a[2]+a[2]+a[tip]; 54 int t2=a[1]+a[tip]+a[1]+a[tip-1]; 55 res+=min(t1,t2); 56 tip-=2; 57 } 58 res+=a[1]+a[3]; 59 } 60 cout<<res<<endl; 61 } 62 return 0; 63 }
poj - 1700 题解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。