couverture de l'intervalle C à la semaine 3

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;
}
Publié 32 articles originaux · loué 0 · visites 694

Je suppose que tu aimes

Origine blog.csdn.net/qq_43814559/article/details/104723436
conseillé
Classement