本文出自:http://blog.csdn.net/svitter

过桥问题解释:一条船能够坐两个人,可是有非常多人要过河,所以送过一个人去,还有一个人还要回来接。使全部人过河之后时间最短,怎样求?

此问题曾作为阿里巴巴题目

初看此题想的太过简单,直接让跑的最快的送过去,自己再跑回来就可以。事实上不然。

函数g(a,b)表示过河,b(a)表示回来。假设过河时间分别为1,2,5,10

那么两种过河方案:

1.初想方案:

g(1,2)=2

g (1, 10) = 10

g (1, 5 ) =  5

b(1) * 2 = 2

sum  =19

2.还有一种方案:. g(1,2) =2

b(1) =1

g(5,10)=10

b(2)=2

g(1,2)=2

sum = 17

还有一种方案就是让两个跑的快的先跑过去,然后一个带回来船,然后两个慢的跑过去,还有一个跑的快的带回来船。

如此两种方案的速度分别为:

设跑的快的分别为a, b,跑的慢的为c, d

那么c, d过河须要的时间分别为:

1.a + a + c + d

2.a +b+b+d

如此一来,求得b+b与a+c的大小关系,则知道取哪种方案最佳。

题目有poj2573, poj1700

1700解题代码:(也有dfs,dp写法,可是我没理解)

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm> using namespace std; int main()
{
int n, sec;
int time[1010];
int t;
int temp;
int i, j, k;
//freopen("test", "r", stdin);
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
memset(time, 0, sizeof(time)); for(i = 0; i < n; i++)
scanf("%d", &time[i]); if(n == 1)
printf("%d\n", time[0]); else if(2 == n)
printf("%d\n", time[0] > time[1] ? time[0] : time[1]); else if(3 == n)
printf("%d\n", time[0] + time[1] + time[2]); else
{
sec = 0;
sort(time ,time + n);
temp = time[1]*2; while(n >=4)
{
sec += time[0];
sec += time[n-1];
i = time[1] * 2;
j = time[0] + time[n-2];
if(i > j)
sec += j;
else
sec += i;
n -= 2;
}
if(2 == n)
printf("%d\n", sec + time[1]); else if(3 == n)
printf("%d\n", sec + time[0] + time[1] + time[2]);
}
} return 0;
}

2573:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue> using namespace std; struct outPut
{
int front, end;
outPut(int a, int b):front(a), end(b){}
outPut(int a):front(a), end(-1){}
}; void output(outPut *a)
{
if(a->end != -1)
printf("%d %d\n", a->front, a->end);
else
printf("%d\n", a->front);
} int main()
{
int temp;
int pe[1010];
int i, j;
int n;
// cost time
int sec;
//freopen("test", "r", stdin);
queue <outPut> Queue;
while(~scanf("%d", &n))
{
//printf("\nCase: \n");
for(i = 0; i < n; i++)
scanf("%d", &pe[i]); if(1 == n)
{
printf("%d\n", pe[0]);
printf("%d\n", pe[0]);
}
//..
else if(2 == n)
{
if(pe[0] > pe[1])
{
i = pe[0];
j = pe[1];
}
else
{
i = pe[1];
j = pe[0];
}
printf("%d\n", i); printf("%d %d\n", j, i);
}
else if(3 == n)
{
sort(pe, pe+3);
printf("%d\n", pe[0]+pe[1]+pe[2]); printf("%d %d\n", pe[0], pe[2]);
printf("%d\n", pe[0]);
printf("%d %d\n", pe[0], pe[1]);
}
else
{
sort(pe, pe+n);
temp = pe[1] * 2;
sec = 0; while(n >= 4)
{
sec += pe[n-1];
sec += pe[0];
if(temp < pe[0] + pe[n-2])
{
Queue.push(outPut(pe[0], pe[1]));
Queue.push(outPut(pe[0]));
Queue.push(outPut(pe[n-2], pe[n-1]));
Queue.push(outPut(pe[1]));
sec += temp;
}
else
{
Queue.push(outPut(pe[0], pe[n-1]));
Queue.push(outPut(pe[0]));
Queue.push(outPut(pe[0], pe[n-2]));
Queue.push(outPut(pe[0]));
sec += pe[0] + pe[n-2];
}
n -= 2;
}
if(2 == n)
{
outPut *tmp;
printf("%d\n", sec + pe[1]);
while(!Queue.empty())
{
tmp = &Queue.front();
output(tmp);
Queue.pop();
}
printf("%d %d\n", pe[0], pe[1]);
}
else if(3 == n)
{
outPut *tmp;
printf("%d\n", sec + pe[0] + pe[1] + pe[2]);
while(!Queue.empty())
{
tmp = &Queue.front();
output(tmp);
Queue.pop();
}
printf("%d %d\n", pe[0], pe[2]);
printf("%d\n", pe[0]);
printf("%d %d\n", pe[0], pe[1]);
} }
}
return 0;
}

杂题_POJ上的过桥问题的更多相关文章

  1. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

  2. dp杂题(根据个人进度选更)

    ----19.7.30 今天又开了一个新专题,dp杂题,我依旧按照之前一样,这一个专题更在一起,根据个人进度选更题目; dp就是动态规划,本人认为,动态规划的核心就是dp状态的设立以及dp转移方程的推 ...

  3. Codeforces 杂题集 2.0

      记录一些没有写在其他随笔中的 Codeforces 杂题, 以 Problemset 题号排序   1326D2 - Prefix-Suffix Palindrome (Hard version) ...

  4. 【Java面试】-- 杂题

    杂题 2019-11-03  21:09:37  by冲冲 1.类加载器的双亲委派机制 类加载器:把类通过类加载器加载到JVM中,然后转换成class对象(通过类的全路径来找到这个类). 双亲委派机制 ...

  5. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  6. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  7. Project Euler18题 从上往下邻接和

    题目:By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ...

  8. wangkoala杂题总集(根据个人进度选更)

    CQOI2014 数三角形 首先一看题,先容斥一波,求出网格内选三个点所有的情况,也就是C(n*m,3);然后抛出行里三点共线的方案数:C(n,3)*m; 同理就有列中三点共线的方案数:n*C(m,3 ...

  9. 2019暑期金华集训 Day6 杂题选讲

    自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...

随机推荐

  1. 九、cocos2dx之Actions

    本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=86 Action是CCNode对象的一种顺序.这些动作经常改变对象的一些属性,比如位置,旋转,缩放等 ...

  2. 【Android】ScrollView+GridView 显示问题

    在使用Android的ScrollView里面嵌套GridView时,设置android:layout_height="wrap_content"属性,运行界面的效果不会出现全部数 ...

  3. linux中/etc与/var目录,各是什么意思?这两个目录下的文件有什么特点?

    http://zhidao.baidu.com/link?url=DkxU9CyhJb_dIUAPCmPmxRtQsENgCzqy5qnLPEj_V9DqNzdt6Qya0U5iCVRCYFkgoRo ...

  4. 一个简单的mfc单页界面文件读写程序(MFC 程序入口和执行流程)

    参考:MFC 程序入口和执行流程  http://www.cnblogs.com/liuweilinlin/archive/2012/08/16/2643272.html 程序MFCFlie      ...

  5. tomcat环境变量的配置(网上摘,全部验证通过)

    tomcat环境变量的配置   1.===> 进入bin目录下,双击startup.bat看是否报错.一般肯定会报. 2.===> 右键我的电脑===>高级===>环境变量   ...

  6. Android:AysncTask异步加载

    以下是链接: http://blog.csdn.net/abc5382334/article/details/17097633 http://keeponmoving.iteye.com/blog/1 ...

  7. AppCode3 常用 设置 及 快捷键 (持续更新)

    以下设置都可以通过 设置中的搜索框 进行关键字搜索 0, 打开Project 设置 Command + ; 1, 打开设置快捷键 Command + , 2, 显示行号 Editor -> Ap ...

  8. python中enumerate 函数

    enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')):  print i,j 0 a 1 b ...

  9. Struts2-ActionContext

    官方解释: The ActionContext is the context in which an {@link Action} is executed. Each context is basic ...

  10. MVC 扩展 Html.ImageFor

    Asp.Net MVC 扩展 Html.ImageFor 方法详解 背景: 在Asp.net MVC中定义模型的时候,DataType有DataType.ImageUrl这个类型,但htmlhelpe ...