La décima aspiradora con robot de copa Blue Bridge

Descripción del problema
El área de oficinas de Xiaoming Company tiene un pasillo largo, que se compone de N áreas cuadradas, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí
Se despliegan K robots de barrido en el pasillo, de los cuales el i-ésimo está en el área de la cuadrícula A i- th.

Se sabe que el robot de barrido puede moverse a los cuadrados adyacentes de la izquierda y la derecha cada minuto y limpiar el área.

Escriba un programa para calcular la ruta de limpieza de cada robot para que

  1. Todos regresan a la plaza de salida eventualmente,
  2. Cada área del cuadrado se ha limpiado al menos una vez,
  3. Toma el menor tiempo desde el inicio de la acción del robot hasta el regreso del último robot.

Tenga en cuenta que varios robots pueden limpiar la misma área cuadrada al mismo tiempo y no se afectarán entre sí.

El menor tiempo que tarda en salir.

En el ejemplo que se muestra en la figura anterior, el tiempo mínimo empleado es 6.

  • Se limpió la primera ruta: 2-1-2-3-4-3-2, área 1, 2, 3 y 4.
  • La segunda ruta: 5-6-7-6-5, 5, 6 y 7 se limpiaron.
  • La tercera ruta: 10-9-8-9-10, limpiado 8, 9 y 10.

Formato de entrada La
primera línea contiene dos números enteros N y K.
Las siguientes K líneas, cada línea tiene un entero Ai .

Formato de
salida Genera un número entero para representar la respuesta.

Entrada de muestra
10 3
5
2
10

Salida de muestra
6

Rango de datos
Para el 30% de los casos de uso de evaluación, 1 ≤ K <N ≤ 10.
Para el 60% de los casos de uso de evaluación, 1 ≤ K <N ≤ 1000.
Para todos los casos de uso de evaluación, 1 ≤ K <N ≤ 100000 y 1 ≤ A i ≤ N.


Solución del problema
Dos puntos:

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100010;

int n, k;
int p[N];

bool check(int x)
{
    
    
    int R = 0;                                  // R 表示机器人已经扫到的区域右边界
    for (int i = 0; i < k; i ++)
    {
    
    
        if(p[i] - x > R) return false;          // 不能无缝衔接扫地区域,则一定失败
        else
        {
    
    
            if(p[i] <= R) R = p[i] + x - 1;     // 在区域内,则从本区域开始,能扫到的最远区域
            else  R += x;                       // 在区域外,则直接从边界累加
        }
    }
    
    return R >= n;                              // 判断是否能扫完整个区域
}

int main()
{
    
    
    cin >> n >> k;
    for (int i = 0; i < k; i ++) cin >> p[i];
    
    sort(p, p + k);
    
    int l = 0, r = n;
    while(l < r)            
    {
    
    
        int mid = l + r >> 1;                   // 二分机器人的扫地范围
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    
    cout << 2 * l - 2 << endl;                  // 花费时间 = 2 × (扫地范围 - 1)
    return 0;
}

PD: 花费时间 = 2 × (扫地范围 - 1)Si no entiende esta oración, puede hacer un dibujo para simularla.


Copa Lanqiao C / C ++ Grupo Competencia provincial Preguntas de años anteriores

Supongo que te gusta

Origin blog.csdn.net/weixin_46239370/article/details/114670379
Recomendado
Clasificación