本文出自: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. elk 搭建

    elk 平台搭建: ELK平台搭建 系统环境 System: Centos release 6.7 (Final) ElasticSearch: 2.1.0 Logstash: 2.1.1 Kiban ...

  2. Windows failed to start.界面下修复win8引导

    首先要保证 系统本身是没有问题的 不是在装机的时候出现这种情况 那么可以按照以下方法来进行 首先要在另外一台电脑上将win8刻进u盘 启动时以u盘为第一启动项启动 进入win8装机界面 点击左下角的修 ...

  3. 【Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西】玛萨玛索男装网购商城

    [Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西]玛萨玛索男装网购商城 Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西

  4. iOS之UITableViewCell左右滑动效果

    首先在 UITableViewCell.h 中声明一个代理 @protocol UITableViewCellSlideDelegate <UITableViewDelegate> @op ...

  5. PHP - 直接输出对象的版本问题

  6. filter过滤器的使用

    从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持.过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种,下面让我们分别来看看这四种过滤器的工作方式: 1.reques ...

  7. javascript时间函数

    //时间函数 var myDate = new Date(); myDate.getYear();        //获取当前年份(2位) myDate.getFullYear();    //获取完 ...

  8. django perm用法

    定义用户model时可以给用户分配权限: class Meta: permissions = (       ("can_mark", "Can mark"), ...

  9. Maven创建项目: Failed to execute goal org.apache.maven.plugin( mvn archetype:create)

    一.概述: 在使用mvn 命令mvn archetype:create -DgroupId=com.chuanliu.c11 -DartifactId=c11searcher在控制创建maven项目和 ...

  10. Codeforces Round #198 (Div. 2) C. Tourist Problem

    C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...