POJ1700 -- 贪心算法
来源:互联网 发布:mac制作启动u盘 编辑:程序博客网 时间:2024/05/21 19:06
一。贪心策略:用最少的时间过河
二。过河方法分析:有俩种方法将最慢的那俩个人送过河。
eg:1 2 5 10
方法1:每次最快的1和次快的2过河,然后最快的1回来,最慢的10和次慢的5过河,最快的2再回来。
此时花费的时间为method1:2+1+10+2;公式为:a[0]+2*a[1]+a[i] (备注:数组a[ ]是从小到大有序排列 )
方法2:每次最快的1和最慢的10过河,最快的1回来,再和次慢的5过河,最快的1再回来。
此时花费的时间为method2:10+1+5+1;公式为:2*a[0]+a[i-1]+a[i]
每次过河的时候,对方法1的时间和方法2的时间进行比较,选择最快的方法过河。
最后的结果都是,最慢的那俩个过河。
三。代码分析:
1. 将输入的速度数组按从小到大进行排序。
2. 当只有一个人和只有俩个人的情况,需要特殊处理。
#include <stdio.h>#include <stdlib.h>int speed[1000];int output=0;void Greedy(int* a, int N){ int i=0,j=0; for(i=N-1;i>0;i=i-2){ if(i==1){ output+=a[1]; }else if(i==2){ output+=a[0]+a[1]+a[i]; }else { int method1 = a[0]+2*a[1]+a[i]; int method2 = 2*a[0]+a[i-1]+a[i]; if(method1 < method2){ output += method1; }else{ output += method2; } } }}int main(){ int T, N ; //freopen("input.txt","r",stdin); scanf("%d",&T); int i=0; for(i=0;i<T;i++){ memset(speed,0,sizeof(speed)); output=0; scanf("%d",&N); int j =0; for(j=0;j<N;j++){ scanf("%d",&speed[j]); //获取int型数组,加&地址。数组名是该数组首元素的地址,故获取 } if(N==1){ printf("%d\n",speed[0]); }else if(N==2){ printf("%d\n",speed[1]);; }else{ fastsort(speed,0,N-1); Greedy(speed,N); printf("%d\n",output); } } return 0;}
0 0
- poj1700 (贪心算法)
- POJ1700 -- 贪心算法
- poj1700 贪心算法
- poj1700 过河问题---贪心算法
- POJ1700 Crossing River(贪心算法训练)
- 贪心poj1700
- poj1700 Crossing River 贪心
- poj1700过河问题(贪心)
- poj1700--贪心--Crossing River
- poj1700 poj2573 经典贪心
- poj1700(贪心)
- poj1700多种选择的贪心
- POJ1700 【经典过河问题,贪心】
- POJ1700 Crossing River(贪心)
- POJ1700--Crossing River(贪心)
- poj1700
- poj1700
- poj1700
- Linux基本功
- MathType公式与Word文档文字对齐的解决办法
- Find命令示例(第一部分)----15个实用的Linux find命令示例
- 平安科技移动开发二队技术周报(第五期)
- HttpClient上传图片,下载文件
- POJ1700 -- 贪心算法
- 4.3-1
- iOS开发UI基础—24使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- vc++6.0配置和使用GDI+
- 致24岁的你
- mybatis foreach标签的解释
- Netty高可靠性设计:优化建议
- iOS开发UI基础—25UITableview控件使用小结
- Hibernat缓存的作用