POJ1700
2016-03-29 14:39
225 查看
Problem: Crossing River
Description: N个人过河,只有一条船。船到了对岸得有人把船划回来。一条船最多坐两个人,过河的时间以慢的为准,问最少需要多少时间才能把所有的人都送到对岸。
Solution: 贪心,首先想到的贪心是,时间多的人要带时间次多的人过河,这个很简单想,于是我们要先对时间进行排序。然后就是痛苦的开始了。我开始想着划船肯定要用时间最少的人来划船,于是一直过不了样例。后来看了下别人的想法,于是明了了,我们还有一种过河方式,就是先让时间最少的两个人先到对岸去,然后随便哪一个把船划回来,然后再让时间最多的两个人同时过河,再让留在对面时间最少的那一个人把船划回来。这样计划有可能比分两次让时间最多和时间次多的人过河时间少。于是,我们就比较一下这两种方式,哪种时间少就用哪种,等到没过河的人少于4个时,这个时候就直接计算就可以了(少于4个人的情况很简单吧)。
Code(C++):
Description: N个人过河,只有一条船。船到了对岸得有人把船划回来。一条船最多坐两个人,过河的时间以慢的为准,问最少需要多少时间才能把所有的人都送到对岸。
Solution: 贪心,首先想到的贪心是,时间多的人要带时间次多的人过河,这个很简单想,于是我们要先对时间进行排序。然后就是痛苦的开始了。我开始想着划船肯定要用时间最少的人来划船,于是一直过不了样例。后来看了下别人的想法,于是明了了,我们还有一种过河方式,就是先让时间最少的两个人先到对岸去,然后随便哪一个把船划回来,然后再让时间最多的两个人同时过河,再让留在对面时间最少的那一个人把船划回来。这样计划有可能比分两次让时间最多和时间次多的人过河时间少。于是,我们就比较一下这两种方式,哪种时间少就用哪种,等到没过河的人少于4个时,这个时候就直接计算就可以了(少于4个人的情况很简单吧)。
Code(C++):
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MIN(a,b) ((a)>(b)? (b):(a)) const int M=1005; int n; int people[M]; int cmp(const void *a,const void *b) { return *((int *)a)-*((int *)b); } int main() { int N; for(scanf("%d",&N);N--;){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&people[i]); qsort(people,n,sizeof(people[0]),cmp); int ans=0; int loop=n-1; while(true){ if(!loop){ ans+=people[0]; break; }else if(loop==1){ ans+=people[1]; break; }else if(loop==2){ 4000 ans+=people[2]+people[1]+people[0]; break; }else ans+=MIN(2*people[0]+people[loop]+people[loop-1], people[0]+2*people[1]+people[loop]); loop-=2; } printf("%d\n",ans); } return 0; }
相关文章推荐
- ionic(angularjs)select下拉选择第一个选项为空白的解决办法
- 322. Coin Change
- leetcode-001-two sum-python
- [简易]中英文混合排序
- 深入探讨ROP 载荷分析
- API。Spark SQL 1.3.0 DataFrame介绍、使用及提供了些完整的数据写入
- Python伪装浏览器爬虫读取网页内容
- node.js学习笔记(4)--使用Express完成简单的登陆
- 读懂这100篇论文,你也能成为大数据专家
- 用Netty开发中间件:高并发性能优化(转)
- Codeforces 639A (set 水~)
- Android小记:编码命名规范
- 如何修改Android Studio主题
- linux之vim命令
- android Palette调色板的使用方法
- AFNetWorking的实现分析以及简单使用
- 数据库处理session类
- hdu5032 Always Cook Mushroom
- POI操作Excel常用方法总结(转)
- cf#276-B - Maximum Value - (数学+暴力)/(二分)