SRM 146 2 1000BridgeCrossing


Problem Statement

A well-known riddle goes like this: Four people are crossing an old bridge. The bridge cannot hold more than two people at once. It is dark, so they can't walk without a flashlight, and they only have one flashlight! Furthermore, the time needed to cross the bridge varies among the people in the group. For instance, let's say that the people take 1, 2, 5 and 10 minutes to cross the bridge. When people walk together, they always walk at the speed of the slowest person. It is impossible to toss the flashlight across the bridge, so one person always has to go back with the flashlight to the others. What is the minimum amount of time needed to get all the people across the bridge?

In this instance, the answer is 17. Person number 1 and 2 cross the bridge together, spending 2 minutes. Then person 1 goes back with the flashlight, spending an additional one minute. Then person 3 and 4 cross the bridge together, spending 10 minutes. Person 2 goes back with the flashlight (2 min), and person 1 and 2 cross the bridge together (2 min). This yields a total of 2+1+10+2+2 = 17 minutes spent.

You want to create a computer program to help you solve new instances of this problem. Given an int[] times, where the elements represent the time each person spends on a crossing, your program should return the minimum possible amount of time spent crossing the bridge.

Definition

  • ClassBridgeCrossing
  • MethodminTime
  • Parametersvector<int>
  • Returnsint
  • Method signatureint minTime(vector<int> times)
(be sure your method is public)

Limits

  • Time limit (s)2.000
  • Memory limit (MB)64

Notes

  • In an optimal solution, exactly two people will be sent across the bridge with the flashlight each time (if possible), and exactly one person will be sent back with the flashlight each time. In other words, in an optimal solution, you will never send more than one person back from the far side at a time, and you will never send less than two people across to the far side each time (when possible).

Constraints

  • times will have between 1 and 6 elements, inclusive.
  • Each element of times will be between 1 and 100, inclusive.

Test cases

    1.  
      • times{ 1, 2, 5, 10 }
       

      Returns17

       
      The example from the text.
    2.  
      • times{ 1, 2, 3, 4, 5 }
       

      Returns16

       
      One solution is: 1 and 2 cross together (2min), 1 goes back (1min), 4 and 5 cross together (5min), 2 goes back (2min), 1 and 3 cross together (3min), 1 goes back (1min), 1 and 2 cross together (2min). This yields a total of 2 + 1 + 5 + 2 + 3 + 1 + 2 = 16 minutes spent.
    3.  
      • times{ 100 }
       

      Returns100

       
      Only one person crosses the bridge once.
    4.  
      • times{ 1, 2, 3, 50, 99, 100 }
       

      Returns162

       #include <cstdio>
      #include <cmath>
      #include <cstring>
      #include <ctime>
      #include <iostream>
      #include <algorithm>
      #include <set>
      #include <vector>
      #include <sstream>
      #include <typeinfo>
      #include <fstream> using namespace std;
      int ti[] , tot = ;
      int a[][] ;
      class BridgeCrossing {
      public:
      int minTime(vector<int> tim) {
      tot = ;
      for (int i : tim) ti[tot ++] = i ; tot -- ;
      sort (ti + , ti + tot + ) ;
      // printf ("tot = %d\n" , tot ) ;
      // for (int i = 1 ; i <= tot ; i ++) printf ("%d " , ti[i]) ; puts ("") ;
      if (tot == ) return ti[] ;
      if (tot == ) return ti[] ;
      int sum = ti[] ;
      for (int i = tot ; i >= ; i -= ) {
      if (i == ) {
      sum += ti[] + ti[] ;
      }
      else {
      if (ti[] + ti[i - ] < * ti[]) sum += ti[] + ti[i] + ti[] + ti[i - ] ;
      else sum += ti[] + ti[i] + ti[] + ti[] ;
      }
      }
      return sum ;
      }
      }; // CUT begin
      ifstream data("BridgeCrossing.sample"); string next_line() {
      string s;
      getline(data, s);
      return s;
      } template <typename T> void from_stream(T &t) {
      stringstream ss(next_line());
      ss >> t;
      } void from_stream(string &s) {
      s = next_line();
      } template <typename T> void from_stream(vector<T> &ts) {
      int len;
      from_stream(len);
      ts.clear();
      for (int i = ; i < len; ++i) {
      T t;
      from_stream(t);
      ts.push_back(t);
      }
      } template <typename T>
      string to_string(T t) {
      stringstream s;
      s << t;
      return s.str();
      } string to_string(string t) {
      return "\"" + t + "\"";
      } bool do_test(vector<int> times, int __expected) {
      time_t startClock = clock();
      BridgeCrossing *instance = new BridgeCrossing();
      int __result = instance->minTime(times);
      double elapsed = (double)(clock() - startClock) / CLOCKS_PER_SEC;
      delete instance; if (__result == __expected) {
      cout << "PASSED!" << " (" << elapsed << " seconds)" << endl;
      return true;
      }
      else {
      cout << "FAILED!" << " (" << elapsed << " seconds)" << endl;
      cout << " Expected: " << to_string(__expected) << endl;
      cout << " Received: " << to_string(__result) << endl;
      return false;
      }
      } int run_test(bool mainProcess, const set<int> &case_set, const string command) {
      int cases = , passed = ;
      while (true) {
      if (next_line().find("--") != )
      break;
      vector<int> times;
      from_stream(times);
      next_line();
      int __answer;
      from_stream(__answer); cases++;
      if (case_set.size() > && case_set.find(cases - ) == case_set.end())
      continue; cout << " Testcase #" << cases - << " ... ";
      if ( do_test(times, __answer)) {
      passed++;
      }
      }
      if (mainProcess) {
      cout << endl << "Passed : " << passed << "/" << cases << " cases" << endl;
      int T = time(NULL) - ;
      double PT = T / 60.0, TT = 75.0;
      cout << "Time : " << T / << " minutes " << T % << " secs" << endl;
      cout << "Score : " << * (0.3 + (0.7 * TT * TT) / (10.0 * PT * PT + TT * TT)) << " points" << endl;
      }
      return ;
      } int main(int argc, char *argv[]) {
      cout.setf(ios::fixed, ios::floatfield);
      cout.precision();
      set<int> cases;
      bool mainProcess = true;
      for (int i = ; i < argc; ++i) {
      if ( string(argv[i]) == "-") {
      mainProcess = false;
      } else {
      cases.insert(atoi(argv[i]));
      }
      }
      if (mainProcess) {
      cout << "BridgeCrossing (1000 Points)" << endl << endl;
      }
      return run_test(mainProcess, cases, argv[]);
      }
      // CUT end

      这个问题大家都很熟悉吧,晚上有5个人过河,只有一盏灯,,他们每个人的过河时间为1,2,3,6,18(另一组人1,10,10,10,10)。每次最多两个人过河(过河必须有一个人带着灯),且过河的时间按走得慢的那个人算,求5个人过河所需的最少时间?

      当然这个问题转到程序里自然是变成了n个人过河喽。

      如果你把上面得数据跑了一遍的话,得到29(另一组43)的话。那么心里大概就有最佳方案的笼统概念了:

      现在令n个人走过的时间分别为a1,a2,a3,a4,a5,……an;(从小到大)

      那么一开始肯定先是1,2过河。

      接着考虑花时间最多的那两个人(必须考虑他们,这点很重要),我们怎么送他们呢?

      第一种方案:

        1回来了,让1把n送过去,然后1回来,再让1把n-1送过去:a1 + an + a1 + a(n-1) ;

      第二种方案:

        1回来了,让n,n-1过河,然后2回来,再1,2过河: a1 + an + a2 + a2 ;

      (如果觉得叙述方案时有奇怪的地方,请见怪不怪,总之是为了让每轮送两人,并且每轮结束时保证1,2都在对岸)

      所以这两种方案进行选择时,只要比较:a1 + a(n-1) 和 2× a2 中较小的即可。

      。。。大概就是这样,因为每次送两人,所以总人数为奇数时,还有点细节要考虑。

tc 146 2 BridgeCrossing(n人过桥问题)的更多相关文章

  1. tc 146 2 RectangularGrid(数学推导)

    SRM 146 2 500RectangularGrid Problem Statement Given the width and height of a rectangular grid, ret ...

  2. 蒟蒻修养之tc蓝名计划

    开一个新坑......(听说tc是智商高的人才能玩的QAQ显然我是被屠的... 1 [645DIV2]这个能说是裸模拟吗... 弃坑= =做了一些题感觉没必要放上来了= =等div1先吧....... ...

  3. [转帖][超级少儿不宜]一氧化氮(NO),为什么亚洲人是最硬

    阴茎科学:一氧化氮(NO),为什么亚洲人是最硬 尼堪巴图鲁   ​关注他 2,911 人赞同了该文章   https://zhuanlan.zhihu.com/p/55941740 超级少儿不宜.. ...

  4. Hznu_oj 2340 你敢一个人过桥吗?

    Description 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过. ...

  5. 【bzoj2073】[POI2004]PRZ

    题目描述 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批 ...

  6. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  7. 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

    返回目录 并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组, ...

  8. Summarize Series For Burying My College

    Summarize  Series  For  Burying  My  College                                             For  Grade ...

  9. POJ 1700 Crossing River (贪心)

    Crossing River Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9585 Accepted: 3622 Descri ...

随机推荐

  1. TCP/IP详解 笔记十三

    TCP协议(一) 概述 特点 1,  面向连接可靠的字节流服务 2,  只有两方通信,不能用于广播或多播 3,  应用数据被TCP分隔为最合适发送的数据段,传给IP协议栈 4,  发送端并启动定时器, ...

  2. Unity3d5.0 新UI之2048

    因为汽车系统没写出来所以,纠结之中,弄了弄新版本的UI. 做了个2048. 新版本的unity的UI必须以Canvas为基底来呈现,如果没有加画布的话可是显示不出来东西的哦. 而且作为UI上的所有组件 ...

  3. HDU 5925 Coconuts

    2016 CCPC 东北四省赛 D. 一道好题. 现场写崩了. 赛后LSh跟我讲了一种离散化的做法, 没听懂. 题意 一个\(R \cdot C\ (R, C\le 10^9)\) 的矩形点阵上有 $ ...

  4. C++ 第一次课堂作业

    GitHub链接: 传送门 题目描述 Create a program that asks for the radius of a circle and prints the area of that ...

  5. Alpha版本十天冲刺——Day 7

    站立式会议 祝曹鑫杰和常松童鞋生日快乐!短短几天冲刺,就迎来了三位队员的生日,希望也给我们的Alpha版本带来好运,加油! 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 上传图片接口 无 ...

  6. java Base64算法的使用

    Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...

  7. runtime - Method详细笔记

    Runtime中Method详细介绍 1.找到它,认识它 //*> 在objc/runtime.h中定义了Method类型,Method是一个objc_method结构体指针,结构体中包含SEL ...

  8. JAVA内存机制

    Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...

  9. spring-data-jpa Repository的基本知识

    1.项目中的Repository对象的使用 2.Repository 引入的两种方式 继承和使用注解 3.Repository接口的定义 Repository 接口是 spring Data 的一个核 ...

  10. IBatis一对多嵌套查询

    1)类 public class AppData { // public int ModuleId { get; set; } public int DataId { get; set; } publ ...