Formação 2 - título C
Você é dado um conjunto de n inteiro números a0, a1, ..., an - 1. Encontre a distância entre dois mínimos (mais próxima) mais próximos na mesma. É garantido que na matriz um mínimo ocorre pelo menos duas vezes.
Entrada
A primeira linha contém inteiro positivo n (2 ≤ n ≤ 105) - tamanho da matriz dada. A segunda linha contém n inteiros a0, a1, ..., An - 1 (1 ≤ ai ≤ 109) - elementos da matriz. É garantido que na matriz um mínimo ocorre pelo menos duas vezes.
Resultado
Imprimir o único número - distância entre dois mínimos mais próximos na matriz.
Exemplos
Entrada
2
3 3
Resultado
1
Entrada
3
5 6 5
Resultado
2
Entrada
9
2 1 3 4 5 1 2 3 1
Resultado
3
#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#define inf 0X7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 5;
struct Node
{
int val;
int pos;
friend bool operator<(Node a, Node b)
{
if (a.val == b.val)
return a.pos > b.pos;
return a.val > b.val;
}
};
priority_queue<Node> a;
int main()
{
int n;
scanf("%d", &n);
int num = 0;
int ans = inf;
for (int i = 0; i < n; i++)
{
int val;
scanf("%d", &val);
Node t;
t.val = val;
t.pos = i;
a.push(t);
}
num = a.top().val;
int lastpos = a.top().pos;
a.pop();
while (a.size() != 0 && a.top().val == num)
{
ans = min(ans, a.top().pos - lastpos);
lastpos = a.top().pos;
a.pop();
}
printf("%d\n", ans);
return 0;
}
Ideias:
uma fila de prioridade armazenar o valor mínimo é obtido a partir da resposta atual e atualizado.