Titre:
Il y a n (1 <= n <= 25 000) intervalles fermés [ai, bi] sur la ligne numérique. Choisissez le moins d'intervalles possible pour couvrir un segment de ligne spécifié [1, t] (1 <= t <= 1 000 000).
Couvrir tout le point, c'est-à-dire que (1,2) + (3,4) peut couvrir (1,4).
Impossible de faire la sortie -1
Contribution:
La première ligne: la
deuxième ligne de N et T à la ligne N + 1: chaque ligne a un intervalle fermé.
Production:
Le nombre d'intervalles sélectionnés ne peut pas être sorti -1
Exemples:
Entrée
3 10
1 7
3 6
6 10
Sortie
2
allusion:
Cette question contient beaucoup de données d'entrée, veuillez utiliser scanf au lieu de cin
Idées:
La stratégie gourmande pour cette question est: l'intervalle sélectionné à chaque fois est l'intervalle avec le plus grand point final incluant le point de départ actuel.
Triez les intervalles en fonction de petits à grands. Si le point de départ de l'intervalle 1 n'est pas inférieur ou égal à 1, alors il n'y a pas de solution, sinon le point de départ est sélectionné dans l'intervalle, y compris le point final avec le plus grand nombre. Après avoir sélectionné cet intervalle [1, trempé], le nouveau point de départ doit être défini sur tempérament + 1, et recherchez à nouveau le segment avec le plus grand point final, y compris tempérage + 1. Répétez cette procédure jusqu'à ce que l'heure> = t ou aucun intervalle ne soit disponible.
Remarque: Le
point entier est couvert, c'est-à-dire que (1,2) et (3,4) peuvent couvrir (1,4), et chaque fois que le début de l'intervalle cible est mis à jour, il devrait être +1 pour la fin du dernier intervalle sélectionné.
Code:
#include <iostream>
#include <algorithm>
using namespace std;
struct zone
{
int be;
int end;
};
bool cmp(zone a, zone b)
{
return a.be < b.be;
}
int main()
{
int count, n, t;
while (scanf("%d %d",&n,&t)!= EOF)
{
count = 0;
zone *temp = new zone[n];
for (int i = 0; i < n; i++)
scanf("%d %d", &temp[i].be, &temp[i].end);
sort(temp, temp + n, cmp);
int tempbe = 0, tempend = 0, index = 0;
while (tempend < t)
{
tempbe = tempend + 1;
for (int i = index; i < n; i++)
{
if (temp[i].be <= tempbe)
{
tempend = max(temp[i].end, tempend);
}
else
{
index = i;
break;
}
}
if (tempbe <= tempend)
count++;
else
break;
}
if (tempend >= t)
cout << count << endl;
else
cout << "-1" << endl;
}
return 0;
}