多个蚂蚁过独木桥,求通过的最长时间和最短时间

首先对题目进行分析:

求最长时间也就是最后掉下去的一只蚂蚁需要经历的最长时间;

求最短时间也就是最后掉下去的一只蚂蚁需要经历的最短时间;所以让所有的蚂蚁都向距离它们最近的那一段走,这样它们每个走的时间是短的,再求它们中用时最短的那个时间;

分析最长时间如下图所示:

/*************************************************************************
	> File Name: 162.cpp
	> Author:
	> Mail:
	> Created Time: 2015年11月10日 星期二 21时22分27秒
 ************************************************************************/

#include<iostream>
using namespace std;
/*input the data*/
void input_data(int *length, int *num, int **x)
{
    cout << "L = ";
    cin >> *length;
    cout << "n = ";
    cin >> *num;
    *x = new int[*num];
    cout << "x = {";
    for (int i = 0; i < *num; i++){
        cin >> (*x)[i];
        cin.get();
        cin.get();
    }
}

int max(int x, int y)
{
    return x > y ? x : y;
}

int min(int x, int y)
{
    return x < y ? x : y;
}
/*solve the problem*/
void solve(int length, int num, int *x)
{
    int min_len = 0;
    int max_len = 0;

    for (int i = 0; i < num; i++){
        if (x[i] < length-x[i]){
            min_len = max(x[i], min_len);
            max_len = max(length-x[i], max_len);
        }
        else{
            min_len = max(min_len, length-x[i]);
            max_len = max(max_len, x[i]);
        }
    }
    cout << "min = " << min_len << endl;
    cout << "max = " << max_len << endl;
}
/*main function*/
int main()
{
    int L, n;
    int *x;

    input_data(&L, &n, &x);

    solve(L, n, x);

    return 0;
}

  

时间: 2024-12-16 01:57:24

多个蚂蚁过独木桥,求通过的最长时间和最短时间的相关文章

二分,求直线上覆盖所有点的最短时间

http://codeforces.com/group/aUVPeyEnI2/contest/230300/problem/E 参考自:https://blog.csdn.net/u013508213/article/details/49594691 题意: 给n个内存读取指针头,m个需要访问的内存地址(1?≤?n,?m?≤?1051?≤?n,?m?≤?105) ,每一秒钟,指针头可以向左移动或者向右移动一个单位,问最少需要多少时间,能把这些内存地址访问完. solution: 二分固定时间t,

今天看到别人的面试算法题,求找出十包粉末中两包蓝色粉末的最短时间

题目:有4个杯子,10包粉末,其中有2包溶于水变蓝,其余无色,粉末溶于水2min才能显现颜色.求找出两包蓝色粉末的最短时间.假设水和粉末用不完. 方法一: 第一趟:[12,34,56,78] 每个杯子分别放两包加水融化,剩下两包不管.可能的情况: (1)0个杯子变色,说明剩下两包就是蓝粉末 (2)1个杯子变色,则蓝粉末在这个杯子两包和未融化的两包其中两包,第二趟四包融化一定可以找到 (3)2个杯子变色,则在这两个杯子的四包粉末中,第二趟可找到. 时间均值:E = 2*1/45 + 4*44/45

poj2395 Out of Hay , 求MST的最长边

点击打开链接 求MST的最长边~ prim #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #define Min(a,b) (a)<(b)?(a):(b) using namespace std; const int INF = 1000000000; const int maxn = 2000 + 5; struct pto { int v, l

VIJOS1107 求树的最长链

vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点倒搜回去. 为什么需要两次呢? 其实很容易想通第一遍dfs的起始点或许并不是最长链的起点 从最远的点倒搜到的最长的链就是所求的解 (因为最长链一定经过这个最远的点啊... 这里注意题目表述: 假设任意的两个风景点都有且仅有一条路径(无回路)相连.显然,任意一个风景点都可以作为游览路线的起点或者终点.

求数组中最长递增子序列的长度

个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 怒冲北京,为理想前行. 题目 解法 使用工具栈单枝遍历数组(思路源于工具栈可以双枝遍历二叉树的方法) 栈里存放的是数组的下

求树中的最长路 (*【模板】)

两次DFS求树中的最长路. 基于邻接矩阵: 代码: #include <stdio.h> #include <string.h> #include <vector> #include <iostream> #include <string> #include <algorithm> using namespace std; bool map[10001][10001]; int n; int tail; bool vis[1001];

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

HDU 1242 Rescue(求最短时间救出同伴,BFS+DP)

Rescue Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and G

编程之美5:求数组中最长递增子序列

最近楼楼被男朋友带着玩dota,有点上瘾,终于在昨天晚上作出了一个重大的决定,shift+delete删掉warIII文件夹,从此退出dota的明争暗斗.不过最近看男票已经将战场从11转到了topcoder,嗯,这是个好现象,希望楼楼也能跟着玩儿起来. 理想是美好的,唉,可是楼主还在编程之美的初级阶段啊.话不多说了,希望自己加油加油再加油!!(^o^)/~ 今天要看的一道题目是求数组中最长递增子序列. 题目简介: 写一个时间复杂度尽可能低的程序,求一个一维数组(N)个元素中的最长递增子序列的长度