杂题_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 设\ ...
随机推荐
- elk 搭建
elk 平台搭建: ELK平台搭建 系统环境 System: Centos release 6.7 (Final) ElasticSearch: 2.1.0 Logstash: 2.1.1 Kiban ...
- Windows failed to start.界面下修复win8引导
首先要保证 系统本身是没有问题的 不是在装机的时候出现这种情况 那么可以按照以下方法来进行 首先要在另外一台电脑上将win8刻进u盘 启动时以u盘为第一启动项启动 进入win8装机界面 点击左下角的修 ...
- 【Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西】玛萨玛索男装网购商城
[Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西]玛萨玛索男装网购商城 Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西
- iOS之UITableViewCell左右滑动效果
首先在 UITableViewCell.h 中声明一个代理 @protocol UITableViewCellSlideDelegate <UITableViewDelegate> @op ...
- PHP - 直接输出对象的版本问题
- filter过滤器的使用
从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持.过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种,下面让我们分别来看看这四种过滤器的工作方式: 1.reques ...
- javascript时间函数
//时间函数 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完 ...
- django perm用法
定义用户model时可以给用户分配权限: class Meta: permissions = ( ("can_mark", "Can mark"), ...
- Maven创建项目: Failed to execute goal org.apache.maven.plugin( mvn archetype:create)
一.概述: 在使用mvn 命令mvn archetype:create -DgroupId=com.chuanliu.c11 -DartifactId=c11searcher在控制创建maven项目和 ...
- 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 ...