题意:

  过河模型:有n个人要渡河,每个人渡河所耗时可能不同,只有1只船且只能2人/船,船速取决于速度慢的人。问最少耗时多少才能都渡完河?

思路:

  n<2的情况比较简单。

  考虑n>2的情况,第一次肯定是两个耗时少的先过去。接下来有两种渡河方式,有可能是{a回,另外2人去,b回,a和b去},也可能是{a回,a和另一人去}。也就是说a和b的协作可以送走其他2个人,或者是a自己当船夫,送走另外一个人。这样子就有两种决策啦。

  先将他们排个序(升序),然后a和b先过去。如果还有人没有过河,若left>=2时,可以选择第一种渡河方式,也可以选择第二种。当left==1就只能选择第二种了。然后转移行了。dp[i]表示送走[1->i]的所有人的花费。

 #include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x7f7f7f7f
#define LL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
int dp[N], path[N];
deque<int> que;
vector<int> vect,ans[N];
int cal(int n)
{
sort(vect.begin(), vect.end()); int a=vect[];
if(n==)
{
printf("%d\n", a );
printf("%d\n", a );
return ;
}
int b=vect[];
if( n== )
{
printf("%d\n", b );
printf("%d %d\n", a, b );
return ;
}
//DP******************
dp[]=b;
path[]=;
for(int i=; i<vect.size(); i++)
{
int t1=a+vect[i];
if(dp[i]>dp[i-]+t1) //送1个
{
dp[i]= dp[i-]+t1 ;
path[i]=;
} if( i+==vect.size() ) continue; //最后1个了
int t2=a+b*+vect[i+];
if(dp[i+]>dp[i-]+t2 ) //送2个
{
dp[i+]=dp[i-]+t2;
path[i+]=;
}
}
que.clear(); //寻找路径
int t=n-;
while(t>)
{
if(path[t]==) que.push_front();
else que.push_front();
t-=path[t];
}
//输出*********************************
printf("%d\n", dp[n-]);
printf("%d %d\n", a, b); //第一步必定是a和b先过去
que.pop_front();
int cnt=;
while(!que.empty())
{
t=que.front(); que.pop_front();
cnt+=t;
if(t==)
{
printf("%d\n", a);
printf("%d %d\n", a, vect[cnt]);
}
if(t==)
{
printf("%d\n", a);
printf("%d %d\n", vect[cnt-], vect[cnt]);
printf("%d\n", b);
printf("%d %d\n", a, b);
}
}
} int main()
{
freopen("input.txt", "r", stdin);
int t, n, a;
cin>>t;
while(t--)
{
vect.clear();
for(int i=; i<N; i++) ans[i].clear();
memset(dp, 0x7f, sizeof(dp));
memset(path, , sizeof(path)); scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d", &a);
vect.push_back(a);
}
cal(n);
if(t) puts("");
}
}

AC代码

UVA 10037 Bridge (基础DP)的更多相关文章

  1. UVa 10037 - Bridge

    题目大意 在一个晚上有N个人过河,他们有一个手电筒,需要有手电筒才能过河,每次最多两个人同时过河,每次过河时间等于速度最慢的那个人的过河时间,让所有人全部过河,花费的时间最少是多少? 分析 如果只有一 ...

  2. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  3. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  4. uva 1356 Bridge ( 辛普森积分 )

    uva 1356 Bridge ( 辛普森积分 ) 不要问我辛普森怎么来的,其实我也不知道... #include<stdio.h> #include<math.h> #inc ...

  5. 基础dp

    队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...

  6. UVA - 1347 Tour(DP + 双调旅行商问题)

    题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径. 分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目 ...

  7. 基础DP(初级版)

    本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...

  8. hdu 5586 Sum 基础dp

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...

  9. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

随机推荐

  1. [hdu4405]Aeroplane chess(概率dp)

    题意:某人掷骰子,数轴上前进相应的步数,会有瞬移的情况,求从0到N所需要的期望投掷次数. 解题关键:期望dp的套路解法,一个状态可以转化为6个状态,则该状态的期望,可以由6个状态转化而来.再加上两个状 ...

  2. 面试题: mysql数据库 已看1 索引和事务 没用

    mysql数据库面试总结 2017年09月04日 00:11:40 阅读数:151 结合网上大神还有自己面试经历,收集的总结Mysql面试题,方便自己准备面试: mysql一个永远都复习不完,尽量总结 ...

  3. Auto Layout Guide----(一)-----Understanding Auto Layout

    Understanding Auto Layout 理解自动布局 Auto Layout dynamically calculates the size and position of all the ...

  4. 1. md5 collision(50)

    md5 collision(50)      ------南京邮电大学ctf: http://chinalover.sinaapp.com/web19/ 发现了一串代码 <?php $md51 ...

  5. 一个工程多个Target

    当我们同一个工程需要在不同情形下编译打包,比如打个人包.企业包的时候,其中可能有一些细小的差别,又不想每次都先修改再打包的时候,我们可以通过创建多个Target来实现. 1.copy原有Target ...

  6. 当我们聊kubernetes operator时,我们在聊些什么

    不聊什么 在开始聊operator前,先说说这篇文章里我们不聊什么.我们这里不聊operator的具体实现,不聊operator的由来历史,不聊operator的hello world.如果想了解这些 ...

  7. PyCharm中导入第三方包

    在Windows中的PyCharm中导入模块的方法 1.在file-->setting-->project interpreter中 2,点击右上角加号,搜索要添加的第三方库的名称,得到后 ...

  8. 51nod1065(set.upper_bound()/sort)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 题意:中文题诶- 思路: 解法1:set容器,将所有前 ...

  9. 阿里云服务器新手安装nginx

    1.域名购买之后 备案. 2.购买服务器. 3.这两个条件具备之后进行下一步. 本人使用Mac ,实践流程按照Mac本的流程操作. 作为初学者,简配的服务器, 实例类型: I/O优化,操作系统: Ce ...

  10. 用户登录之记住密码 Cookie实现