poj1700 crossing river 贪心(手动翻译)
2016-01-25 11:50
120 查看
一组N多人的想过河去,只有一条船,它最多可承载两个人。因此想出一种安排划船来回让所有的人可能过河。每个人都有不同的划船速度;两人一起时速度由较慢的一个速度决定。你的任务是确定策略,花最少的时间让所有人能过河。(提示:船开过去后,还需要有人划回来)
输入
输入的第一行包含一个整数T(1<= T<=20),表示有T组测试数据。接下来T组数据。每组数据第一行为N,第二行包含N个整数表示每个人过河时间。每个案例之前有一个空行。不会超过1000人,没有人需要超过100秒时间。
输出:
每组数据一行,表示N个人全部通过的最少时间。
样例输入:
1
4
1 2 5 10
样例输出:
17
首先如果只有一个人和两个人和三个人要特殊讨论,原因自己理解一下...大于等于四人的时候,大家可以自己模拟一下,就很容易得出结论,因为很简单这里就让大家自己去想了,下面是代码~
输入
输入的第一行包含一个整数T(1<= T<=20),表示有T组测试数据。接下来T组数据。每组数据第一行为N,第二行包含N个整数表示每个人过河时间。每个案例之前有一个空行。不会超过1000人,没有人需要超过100秒时间。
输出:
每组数据一行,表示N个人全部通过的最少时间。
样例输入:
1
4
1 2 5 10
样例输出:
17
首先如果只有一个人和两个人和三个人要特殊讨论,原因自己理解一下...大于等于四人的时候,大家可以自己模拟一下,就很容易得出结论,因为很简单这里就让大家自己去想了,下面是代码~
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<math.h> using namespace std; int a[1001]; bool cmp(int a,int b) { return a>b; }//想不起greater怎么写了.... int work(int s,int e) { if(e==s||e-s==1)return a[s]; else if(e-s==2)return a[s]+a[s+1]+a[s+2]; else { int A=a[e],B=a[e-1],z=a[s],y=a[s+1],s1=0; if(2*B>=A+y)s1=2*A+z+y; else s1=2*B+A+z; } return s1+work(s+2,e); } int main() { int t; cin>>t; while(t--) { int n,i,j,k; cin>>n; for(i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+1+n,cmp); cout<<work(1,n)<<endl; } return 0; }
相关文章推荐
- 驱动大尺寸数码管的方法与电路
- 比较两个无符号数的大小
- 晒晒新买的“百度旋转音箱”
- 汇编编程问题:X + Y + Z => 显示
- 汇编语言编程:1 + 2 + 3 + 4 + 5 + …… + n
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(三)创世纪
- 80x86 汇编语言:在屏幕右上角显示系统时间
- 汇编语言编程:按照凯撒密码的规则加密
- 基于51单片机的99-00倒计时秒表
- 用80x86汇编语言编程:分类统计字符个数
- Android中Service类中onStartCommand返回值介绍
- 用C51语言设计程序,实现0~99秒计数器
- 用51单片机汇编语言,写一个60s倒计时的程序
- 用51单片机汇编语言,编写“键控加减一”的程序
- OC浮点数是否需要加上f后缀
- 三层登录——VB.NET版
- Visual Studio 快捷键
- AutoTile 自动拼接(四) 学习与实践
- ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
- 动态获取cell高度