首页 > 学院 > 开发设计 > 正文

独木桥 洛谷1007 模拟

2019-11-11 05:17:09
字体:
来源:转载
供稿:网友

题目背景


战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳一个人通过。假如有两个人相向而行在桥上相遇,那么他们两个人将无妨绕过对方,只能有一个人回头下桥,让另一个人先通过。但是,可以有多个人同时呆在同一个位置。

题目描述


突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,你的部队必须撤下独木桥。独木桥的长度为L,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为1,但一个士兵某一时刻来到了坐标为0或L+1的位置,他就离开了独木桥。 每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。 由于先前的愤怒,你已不能控制你的士兵。甚至,你连每个士兵初始面对的方向都不知道。因此,你想要知道你的部队最少需要多少时间就可能全部撤离独木桥。另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。

输入输出格式


输入格式:


第一行:一个整数L,表示独木桥的长度。桥上的坐标为1…L 第二行:一个整数N,表示初始时留在桥上的士兵数目 第三行:有N个整数,分别表示每个士兵的初始坐标。

输出格式:


只有一行,输出两个整数,分别表示部队撤离独木桥的最小时间和最大时间。两个整数由一个空格符分开。

输入输出样例


输入样例#1:


4 2 1 3

输出样例#1:


2 4

说明


初始时,没有两个士兵同在一个坐标。 数据范围N<=L<=1000。

Analysis


是在下输了 最短的情况不难想到左边的人全部向左,右边的人全部向右,然后找最大值 最久的久比较神奇了 首先每个士兵都有相等的速度,没有分别,也就是可以彼此替换 那么相向的两士兵折返其实可以看作代替对方直走了 也就是说在左边的向右走,右边的人向左走的最大值 不得不服

Code


#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <iostream>#include <algorithm>#include <string>#include <vector>#include <deque>#include <list>#include <set>#include <map>#include <stack>#include <queue>#include <numeric>#include <iomanip>#include <bitset>#include <sstream>#include <fstream>#define debug puts("-----")#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)#define fill(x, t) memset(x, t, sizeof(x))#define pb push_back#define PI (acos(-1.0))#define EPS (1e-8)#define INF (1<<30)#define ll long long#define db double#define ld long double#define N 5001#define E N * 8 + 1#define MOD 100000007#define L 255inline int read(){ int x = 0, v = 1; char ch = getchar(); while (ch < '0' || ch > '9'){ if (ch == '-'){ v = -1; } ch = getchar(); } while (ch <= '9' && ch >= '0'){ x = (x << 1) + (x << 3) + ch - '0'; ch = getchar(); } return x * v;}using std:: vector;inline int min(const int &x, const int &y){ return x<y?x:y;}inline int max(const int &x, const int &y){ return x>y?x:y;}int main(void){ int l = read(), n = read(); if (!n){ PRintf("0 0/n"); return 0; } vector<int> v; rep(i, 1, n){ v.pb(read()); } int mnAns = 0, mxAns = 0; rep(i, 0, v.size() - 1){ mnAns = max(mnAns, min(v[i], (l - v[i] + 1))); mxAns = max(mxAns, max(v[i], (l - v[i] + 1))); } printf("%d %d/n", mnAns, mxAns); return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表