UVA10037
来源:互联网 发布:win32编程还有用吗 编辑:程序博客网 时间:2024/06/03 09:35
题意:有N个人要过桥,每个人速度不同,只有一个手电筒,每次最多只能过去两个人,问所有人最短的过桥时间为多少
题解:贪心法解决问题
当人数小于等于3时分情况讨论,大于等于4时,有两种贪心策略:
1.最快速度的人每次带一个当前速度最慢的人过去,自己返回;再带一个当前速度最慢的人过去, 再返回
2.最快速度的人和速度第二快的人一起过去;
最快速的人返回,速度最慢的两个人一起过去;
速度第二快的人返回
(每次循环把当前速度最慢的两个人带到河岸)
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int maxn=1500;int speed[maxn];int main(){ int T; int n; int i; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&speed[i]); sort(speed,speed+n); int sum=0; int p=n; int t; for(i=n-1;i>=3;i-=2) { int t1=2*speed[0]+speed[i]+speed[i-1]; int t2=2*speed[1]+speed[0]+speed[i]; sum+=min(t1,t2); } if(i==0) sum+=speed[0]; else if(i==1) sum+=speed[1]; else sum=sum+speed[0]+speed[1]+speed[2]; printf("%d\n",sum); for(int i=n-1;i>=3;i-=2) { int t1=2*speed[0]+speed[i]+speed[i-1]; int t2=2*speed[1]+speed[0]+speed[i]; if(t1<t2) { printf("%d %d\n",speed[0],speed[i]); printf("%d\n",speed[0]); printf("%d %d\n",speed[0],speed[i-1]); printf("%d\n",speed[0]); } else { printf("%d %d\n",speed[0],speed[1]); printf("%d\n",speed[0]); printf("%d %d\n",speed[i-1],speed[i]); printf("%d\n",speed[1]); } } if(i==1) printf("%d %d\n",speed[0],speed[1]); else if(i==2) { printf("%d %d\n",speed[0],speed[1]); printf("%d\n",speed[0]); printf("%d %d\n",speed[0],speed[2]); } else printf("%d\n",speed[0]); if(T) cout<<endl; } return 0;}
0 0
- UVA10037
- UVa10037 Bridge
- 学习 图形着色器-理论与实践 graphic shaders - glman
- JAVA多态性实现机制
- [期望DP] UNR #1 合唱队形
- [李景山php]thinkphp核心源码注释|Taglib.class.php
- SpringObjectFactory 空指针问题
- UVA10037
- Java开发之Spring MVC(二)
- JavaScript中的splice方法
- java操作mongodb数据库
- orbslam作者的ppt
- [李景山php]thinkphp核心源码注释|Cx.class.php
- 手把手教你做视频播放器(五)-视频列表的横屏
- SCI/EI论文写作常用句型
- [构造] UNR #1 Jakarta Skyscrapers