当前位置: 首页 > 面试题库 >

2009 ACM-ICPC世界总决赛带来的飞机调度挑战

蒋星雨
2023-03-14
问题内容

出于好奇,我正在检查2009
ACM国际大学编程竞赛的问题。这些问题很有趣。可在http://cm.baylor.edu/resources/pdf/2009Problems.pdf上找到它们。我无法提出解决问题1的算法,我将在这里重现。它在办公室引起了热烈的讨论,我们认为我们已经很接近答案了,但是如果有人可以找到/制定出完整的解决方案(不需要代码),我们将不胜感激。

为了方便起见,我将在此处重现问题:

问题1

考虑安排在机场降落的飞机的任务。进来的飞机报告其位置,方向和速度,然后管制员必须制定着陆时间表,以使所有飞机安全着陆。通常,连续降落之间的时间越长,降落时间表越“安全”。这些额外的时间使飞行员有机会对天气变化和其他意外做出反应。幸运的是,可以自动执行此计划任务的一部分-
这就是您要进入的地方。您将获得飞机着陆的场景。每架飞机都有一个可以安全着陆的时间窗。您必须计算遵守这些时间窗口的所有飞机着陆的命令。此外,飞机的着陆区应尽可能伸展,以使连续着陆之间的最小时间间隔尽可能大。例如,如果三架飞机分别在上午10:00,上午10:05和上午10:15降落,则最小间隔为五分钟,这是前两架飞机之间的间隔。并非所有间隙都必须相同,但最小的间隙应尽可能大。

输入项

输入文件包含几个测试用例,其中包含着陆方案的描述。每个测试用例开始于包含单个整数的线 Ñ (2≤ Ñ ≤8),这是在场景中的飞机的数量。接下来是
n 条线,每条线包含两个整数 a ib i,给出了第 i 个平面可以安全着陆的闭合间隔[ a ib i ]
的开始和结束。数字 一个 b 以分钟指定和满足0≤ 一个 b 我
≤1440。输入终止与含有单个整数零的线。

输出量

对于输入中的每个测试用例,请打印其用例编号(以1开头),然后打印连续着陆之间可达到的最小时间间隔。打印时间分为分钟和秒,四舍五入到最接近的秒。遵循示例输出的格式

样本输入

3
0 10
5 15
10 15
2
0 10
10 20
0

样本输出

Case 1: 7:30
Case 2: 20:00

问题答案:

我会做这样的事情:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef uint MASK;
#define INPUT_SCALE 60
#define MAX_TIME (1440 * 60)


void readPlaneData(int& endTime, MASK landingMask[MAX_TIME], int index)
{
    char buf[128];
    gets(buf);
    int start, end;
    sscanf(buf, "%d %d", &start, &end);

    for(int i=start * INPUT_SCALE; i<=end * INPUT_SCALE; i++)
        landingMask[i] |= 1 << index;

    if(end * INPUT_SCALE > endTime)
        endTime = end * INPUT_SCALE;
}


int findNextLandingForPlane(MASK landingMask[MAX_TIME], int start, int index)
{
    while(start < MAX_TIME)
    {
        if(landingMask[start] & (1 << index))
            return start;
        start++;
    }

    return -1;
}


bool canLandPlanes(int minTime, MASK landingMask[MAX_TIME], int planeCount)
{
    int next = 0;
    for(int i=0; i<planeCount; i++)
    {
        int nextForPlane = findNextLandingForPlane(landingMask, next, i);
        if(nextForPlane == -1)
            return false;

        next = nextForPlane + minTime;
    }

    return true;
}


int main(int argc, char* argv[])
{
    while(true)
    {
        char buf[128];
        gets(buf);
        int count = atoi(buf);
        if(count == 0)
            break;

        MASK landingMask[MAX_TIME];
        memset(landingMask, 0, sizeof(landingMask));

        int endTime = 0;
        for(int i=0; i<count; i++)
            readPlaneData(endTime, landingMask, i);

        while((endTime > 0) && !canLandPlanes(endTime, landingMask, count))
            endTime--;

        printf("%d:%02d\n", endTime / 60, endTime % 60);
    }
}


 类似资料:
  • 我使用RoboSpice与GsonSpringAndroidSpiceService。我还想添加Realm来保存数据。 问题是在realm中,每个对象都必须扩展realmObject,但是roboSpice中的gson试图解析realmObject,而不是忽略它。 我试图添加排除声明: 然后 还尝试(单独)将@expose添加到对象中的字段,以及 在这两个方面,我有相同的错误: 请帮助我与任何想法

  • 欢迎来到OpenGL的世界。这个工程只是我(Joey de Vries)的一次小小的尝试,希望能够建立起一个完善的OpenGL教学平台。无论你学习OpenGL是为了学业,找工作,或仅仅是因为兴趣,这个网站都将能够教会你现代(Core-profile) OpenGL从基础,中级,到高级的知识。LearnOpenGL的目标是使用易于理解的形式,使用清晰的例子,展现现代OpenGL的所有知识点,并与此同

  • Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。div.body h3{margin:5px 0px 0px 0px;} CEPH 对象存储 REST 风格的接口 与 S3 和 Swift 兼容的 API S3 风格的子域 统一的 S3/Swift 命名空间 用户管理 利用率跟踪 条带化对象 云解决方案集成 多站点部署 灾难恢复 Ceph 块设备 瘦接口支持 映像尺寸最大

  • Netflix在2012年开始意识到他们的架构要满足他们庞大的用户群体已经变得步履维艰。因此他们决定重新设计架构来减少REST调用的次数。取代几十次的REST调用,而是让客户端自己处理需要的数据,他们决定基于客户端需求创建一个专门优化过的REST调用。 为了实现这一目标,他们决定尝试响应式,开始将.NET Rx迁移到JVM上面。他们不想只基于Java语言;而是整个JVM,从而有可能为市场上的每一种

  • 那么当http2被广泛采用的时候,世界将会成什么样呢?或者说,它会被真正的采用吗? 8.1. http2会如何影响普通人? 到目前为止,http2还没被大范围部署使用,我们也无法确定到底会发生什么变化,但至少可以参考SPDY的例子和曾经做过的实验来进行大概的估计。 http2减少了网络往返传输的数量,并且用多路复用和快速丢弃不需要的流的办法来完全避免了head of line blocking(线

  • 安装symfony2 我们默认你使用的是centos7操作系统并已经安装好了php和nginx(如果还没有请回过头看前面几篇)。 首先,我们来安装symfony安装器。假设我们要安装到/usr/local/bin下,那么执行 sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony sudo chmod a+x

  • 我正在尝试解决hackerrank中的一个“几乎已排序”的挑战。问题是: 给定一个包含元素的数组,可以只使用以下操作之一按升序对该数组进行排序吗? 交换两个元素。反转一个子段。 输入格式 第一行包含一个整数,指示数组的大小。 下一行包含以空格分隔的整数。 样本输入#1 2 4 2 示例输出 #1 是< br >交换1 2 示例输入 #2 3 3 1 2 样品输出#2 不 示例输入 #3 6 1 5

  • 本章主题 ♦ 什么是Python ♦ Python的起源 ♦ Python的特点 ♦ 下载Python ♦ 安装Python ♦ 运行Python ♦ Python文档 ♦ 比较Python(与其他语言的比较) ♦ 其他实现 开篇将介绍一些Python的背景知识,包括什么是Python、Python的起源和它的一些关键特性。一旦你来了兴致,我们就会向你介绍怎样获得Python,以及如何在你的系统上