A 10ª Ponte Azul do Robô-Vácuo

Descrição do problema
A área de escritórios da Xiaoming Company possui um longo corredor, que é composto por N áreas quadradas, conforme mostrado na figura abaixo.
Insira a descrição da imagem aqui
K robôs de varredura são implantados no corredor, dos quais o i-ésimo está na área da grade A i- ésima.

Sabe-se que o robô de varredura pode se mover para os quadrados adjacentes à esquerda e à direita a cada minuto e limpar a área.

Escreva um programa para calcular a rota de limpeza de cada robô para que

  1. Todos eles voltam para a praça de embarque eventualmente,
  2. Cada área quadrada foi limpa pelo menos uma vez,
  3. Leva menos tempo desde o início da ação do robô até o retorno do último robô.

Observe que vários robôs podem limpar a mesma área quadrada ao mesmo tempo e não afetarão uns aos outros.

O menor tempo para a produção.

No exemplo mostrado na figura acima, o tempo mínimo gasto é 6.

  • A primeira rota: 2-1-2-3-4-3-2, áreas 1, 2, 3 e 4 foram limpas.
  • A segunda rota: 5-6-7-6-5, 5, 6 e 7 foram limpos.
  • A terceira rota: 10-9-8-9-10, limpa 8, 9 e 10.

Formato de entrada A
primeira linha contém dois inteiros N e K.
Próximas K linhas, cada linha tem um inteiro Ai .

Formato de
saída Produz um inteiro para representar a resposta.

Entrada de amostra
10 3
5
2
10

Resultado de amostra
6

Faixa de dados
Para 30% dos casos de uso de avaliação, 1 ≤ K <N ≤ 10.
Para 60% dos casos de uso de avaliação, 1 ≤ K <N ≤ 1000.
Para todos os casos de uso de avaliação, 1 ≤ K <N ≤ 100000 e 1 ≤ A i ≤ N.


Solução do problema
Dois pontos:

#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;
}

ps: 花费时间 = 2 × (扫地范围 - 1)Se você não entende esta frase, você pode fazer um desenho para simular.


Competição Provincial do Grupo Lanqiao Cup C / C ++ Perguntas dos anos anteriores

Acho que você gosta

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