Título:
Existem n intervalos fechados [a_i, b_i] na linha numérica. Pegue o mínimo de pontos possível para que haja pelo menos um ponto em cada intervalo (os pontos contidos em diferentes intervalos podem ser os mesmos)
Entrada:
1 número inteiro N na primeira linha (N <= 100)
Linha 2 ~ N + 1, dois números inteiros a, b em cada linha (a, b <= 100)
Resultado:
Um número inteiro representando o número de pontos selecionados
Exemplos:
Entrada
2
1 5
4 6
Resultado
1
Entrada
3
1 3
2 5
4 6
Resultado
2
Idéias:
A estratégia gananciosa para esta pergunta é: selecione o último ponto do intervalo. Classifique todos os intervalos por final, de pequeno a grande, e quando final for o mesmo, classifique por grande a pequeno.
Prova:
1. Quando o intervalo contém, se houver um ponto na célula, deve haver um ponto no intervalo grande; portanto, devemos preferir selecionar o ponto na célula, para que o intervalo grande não precise de pontos. Se o intervalo contiver a situação, as células vizinhas serão selecionadas preferencialmente ao atravessar de acordo com este método de classificação.Neste caso, a estratégia gananciosa está correta.
2. Quando os pontos iniciais dos intervalos são organizados em ordem crescente, o último ponto no intervalo de seleção pode obviamente incluir mais intervalos.Neste caso, a estratégia gananciosa também está correta.
Código:
#include <iostream>
#include <algorithm>
using namespace std;
struct zone
{
int be;
int end;
};
bool cmp(zone a, zone b)
{
if (a.end == b.end)
return a.be > b.be;
return a.end < b.end;
}
int main()
{
int be, end, n, count;
while (scanf("%d",&n)!=EOF)
{
count = 1;
zone *temp = new zone[n];
for (int i = 0; i < n; i++)
{
cin >> be >> end;
temp[i].be = be;
temp[i].end = end;
}
sort(temp,temp+n,cmp);
int j = 0;
for (int i = 1; i < n; i++)
{
if (temp[i].be > temp[j].end)
{
j = i;
count++;
}
}
cout << count << endl;
}
return 0;
}