贪心-POJ 1700 过河问题
来源:互联网 发布:数据分析的方法 编辑:程序博客网 时间:2024/05/21 17:52
题意:
n个人过河, 船每次只能坐两个人, 船载每个人过河的所需时间不同,过河时间以耗时间长的那个为实际耗时, 如何得出最快的过河时间。
思路:
1 每次最快和那些慢的过去,然后让最快一直来回,最后全部到对岸。
2 还有一种情况,你先让两个快的人从A过去至B,然后挑一个人回来至A,留下一个快的在B。OK,回来以后我让两个最慢的过去至B,然后让B那边的快的过来接A这边的快的。这样或许会省时一点。
我们假设只有四个人,tf(the fast最快),sf(second fast次快),ss(second slower次慢),ts(the slower最慢)。O
第一种情况:
tf兜来兜去的case:
tf+ts–>
<–tf
tf+ss–>
<–tf
tf+sf–>
第二种情况:
tf+sf–>
<–sf
ts+ss–>
<–tf
tf+sf–>
体会:遇到这种因素会变的题目(人数),应当一种一种情况分开讨论,有相同规律的用相同的手法解答,把大问题放小了看,只看眼前,贪心一点,例如当多于5个人时,我就只看4个人。
n个人过河, 船每次只能坐两个人, 船载每个人过河的所需时间不同,过河时间以耗时间长的那个为实际耗时, 如何得出最快的过河时间。
思路:
1 每次最快和那些慢的过去,然后让最快一直来回,最后全部到对岸。
2 还有一种情况,你先让两个快的人从A过去至B,然后挑一个人回来至A,留下一个快的在B。OK,回来以后我让两个最慢的过去至B,然后让B那边的快的过来接A这边的快的。这样或许会省时一点。
我们假设只有四个人,tf(the fast最快),sf(second fast次快),ss(second slower次慢),ts(the slower最慢)。O
第一种情况:
tf兜来兜去的case:
tf+ts–>
<–tf
tf+ss–>
<–tf
tf+sf–>
第二种情况:
tf+sf–>
<–sf
ts+ss–>
<–tf
tf+sf–>
然后各类的时间消掉,会得出两种方案的最终比较:2*sf和tf+ss的比较;
代码如下:
#include<stdio.h>void quicksort(int left,int right,int a[1005]){ int i,j,t,temp; if(left>right) return; temp=a[left]; //temp中存的就是基准数 i=left; j=right; while(i!=j) { //顺序很重要,要先从右边开始找 while(a[j]>=temp && i<j) j--; //再找左边的 while(a[i]<=temp && i<j) i++; //交换两个数在数组中的位置 if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //最终将基准数归位 a[left]=a[i]; a[i]=temp; quicksort(left,i-1,a);//继续处理左边的,这里是一个递归的过程 quicksort(i+1,right,a);//继续处理右边的 ,这里是一个递归的过程}int main(){ int i,T,N,time[1005]; int totle; scanf("%d",&T); while(T--) { totle=0; scanf("%d",&N); for(i=1;i<=N;i++) scanf("%d",&time[i]); quicksort(1,N,time); if(N==1) printf("%d\n",time[1]); else if(N==2) printf("%d\n",time[2]); else if(N==3) printf("%d\n",time[3]+time[1]+time[2]); else { for(i=N;i>3;i-=2) { if(2*time[2]>time[1]+time[i-1]) { totle+=2*time[1]+time[i]+time[i-1]; } else totle+=2*time[2]+time[i]+time[1]; } if(i==3) totle+=time[3]+time[1]+time[2]; else if(i==2) totle+=time[2]; printf("%d\n",totle); } } return 0;}
体会:遇到这种因素会变的题目(人数),应当一种一种情况分开讨论,有相同规律的用相同的手法解答,把大问题放小了看,只看眼前,贪心一点,例如当多于5个人时,我就只看4个人。
阅读全文
0 0
- POJ-1700 过河问题【贪心】
- 贪心-POJ 1700 过河问题
- POJ 1700 经典过河问题(贪心)
- POJ-1700 &&NYOJ 47 过河问题【贪心】
- poj 1700 过河贪心
- poj 1700 贪心过河
- POJ 1700 & NYLG 47 过河问题(贪心 || DP)
- POJ 1700 Crossing River 过河问题 贪心法
- poj 2573 Bridge(贪心:过河问题)
- poj 1700过河问题
- poj 1700过河问题
- poj 1700 过河问题
- poj 1700 过河问题
- poj 1700 n人过河(贪心)
- 贪心问题--过河问题
- POJ 1700(过河问题)
- POJ 1700(过河问题)
- 【贪心DP】过河问题
- Android stroke 边框线 某一边
- 浅析Java中CountDownLatch用法
- 树分治
- 树状网络攻击(LCA和树上差分的应用)
- Mysql 字符串Split之存储过程实现
- 贪心-POJ 1700 过河问题
- NIO阻塞与非阻塞IO
- mysql将一个表的数据插入到另外一个表,如果某个字段已经存在将不插入的sql
- vimscrip学习——基础
- (POJ
- 常用的mysql语句及命令语句
- iOS MQTT使用案例 (断线重连)
- vmware虚拟机ubuntu桥接上网
- spring与mybatis整合实例