杂题_POJ上的过桥问题
本文出自: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上的过桥问题的更多相关文章
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- dp杂题(根据个人进度选更)
----19.7.30 今天又开了一个新专题,dp杂题,我依旧按照之前一样,这一个专题更在一起,根据个人进度选更题目; dp就是动态规划,本人认为,动态规划的核心就是dp状态的设立以及dp转移方程的推 ...
- Codeforces 杂题集 2.0
记录一些没有写在其他随笔中的 Codeforces 杂题, 以 Problemset 题号排序 1326D2 - Prefix-Suffix Palindrome (Hard version) ...
- 【Java面试】-- 杂题
杂题 2019-11-03 21:09:37 by冲冲 1.类加载器的双亲委派机制 类加载器:把类通过类加载器加载到JVM中,然后转换成class对象(通过类的全路径来找到这个类). 双亲委派机制 ...
- 贪心/构造/DP 杂题选做Ⅱ
由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- Project Euler18题 从上往下邻接和
题目:By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ...
- wangkoala杂题总集(根据个人进度选更)
CQOI2014 数三角形 首先一看题,先容斥一波,求出网格内选三个点所有的情况,也就是C(n*m,3);然后抛出行里三点共线的方案数:C(n,3)*m; 同理就有列中三点共线的方案数:n*C(m,3 ...
- 2019暑期金华集训 Day6 杂题选讲
自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...
随机推荐
- python 中函数参数传递形式
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- IT第二十六天 - Swing、上周总结
IT第二十六天 上午 Swing 1.对于方法的参数如果是int数值类型,应该直接调用该类中的常量属性,而不应该直接填入数字 2.Toolkit类中定义的方法是可以直接访问本地计算机(操作系统)信息的 ...
- Python3 官方文档翻译 - 5 数据结构
这章会更详细地描述了一些你已经学过的知识,同时添加一些新东西. 5.1 List进阶 下面是关于List的所有方法 list.append(x) 将元素添加至列表尾,相当于a[len(a):] = [ ...
- 用C语言写一个程序,得出当前系统的整形数字长(16位,32位,64位)等,不能使用sizeof()
#include <iostream>#include <cmath>using namespace std; int main(){ int num = -1; unsign ...
- 1298 The Hardest Problem Ever
题目链接:http://poj.org/problem?id=1298 思路分析:水题,字符偏移求解,注意字符串输入问题即可. 代码如下: #include <iostream> #inc ...
- UVA 10341 Solve It 解方程 二分查找+精度
题意:给出一个式子以及里面的常量,求出范围为[0,1]的解,精度要求为小数点后4为. 二分暴力查找即可. e^(-n)可以用math.h里面的exp(-n)表示. 代码:(uva该题我老是出现Subm ...
- NAT简单介绍
NAT本质就是让一群机器公用同一个IP.还有一个重要的用途是保护NAT内的主机不受外界攻击 NAT类型: 1.Full Cone:IPport不受限 Full Cone仅仅做单纯的地址转换,不正确进出 ...
- BZOJ 3713: [PA2014]Iloczyn( 枚举 )
斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...
- 设置TextView的密码效果以及跑马灯效果
密码效果以及跑马灯效果: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- Rsync、Unison及DRBD的比较
一.Rsync Rsync(remote synchronize),顾名思义,可以知道这是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的 “Rsync算法”来 ...