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.
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
- Todos eles voltam para a praça de embarque eventualmente,
- Cada área quadrada foi limpa pelo menos uma vez,
- 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