[La pensée et de la pratique de programmation Semaine3 travail C] couverture de l'intervalle

Signification des questions:

Il y a une ligne de nombre n (1 <= n <= 25 000) un intervalle fermé [ai, bi], choisi pour couvrir une gamme aussi faible que segment spécifié [1, t] (1 < = t <= 1000000).
-1 sorties l'impossible.

entrée:

Première ligne: N T et la
seconde rangée N + 1 de la ligne: chaque ligne d'un intervalle fermé.

Entrée de l'échantillon:

3 10
1 7
3 6
6 10

sortie:

nombre sélectionné d'intervalles, la sortie de l'impossible -1

Sortie de l'échantillon:

2

idées:

Pour sélectionner le moins possible pour couvrir la plage de la fourchette cible, de sorte que chaque couverture intervalle sélectionné aussi large que possible du point de départ de l'intervalle (la raison pour laquelle est parce que dès le départ si à partir du milieu pour sélectionner une plage plus grande, ont alors couvrir la tête et la queue vous pouvez utiliser plus de portée). Ainsi, l'extrémité gauche de la première section de l'ordre croissant, puis conformément à ce qui précède stratégie gourmande intervalle de sélection, après l'élection, chaque intervalle de temps, l'intervalle de mise à jour du point de départ cible (la fin de l'intervalle courant a couvert +1), répéter l'intervalle de sélection de l'étape précédente, jusqu'à ce que la couverture complète de tous distance de la cible.

Points sujettes à l'erreur:

1. recouvrant le point de l' ensemble, à savoir, (1,2) et (3,4) peut couvrir (1,4), chaque plage cible de mise à jour lorsque extrémité de départ du dernier intervalle sélectionné 1.
2. Le code de démarrage en boucle, la raison pour laquelle le rside (point de départ à droite, pointe vers le rôle actuel de l'extrémité droite de l' intervalle a couvert) est réglé sur 0 au lieu de 1, est parce que si la fin d'une fourchette cible, ne sera pas trouvée et met fin à la variable de comptage à 0, il doit être réglé sur 0 pour rside.

code:

#include <iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(pair<int,int>&a,pair<int,int>&b)
{
	
	return a.first<b.first;
}

int main(int argc, char** argv) {
	int n,t;
	scanf("%d%d",&n,&t);
	vector<pair<int,int>> val(n);
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&val[i].first,&val[i].second);
	}
	sort(val.begin(),val.end(),cmp);
	int lside=1,rside=0,count=0;
	int i=0;
	while(rside<t)
	{
		while(i<n&&val[i].first<=lside)
		{
			if(rside<val[i].second)
				rside=val[i].second;
			i++;
		}
		if(rside<lside)
		{
			count=-1;
			break;
		}
		count++;
		lside=rside+1;
	}
	return 0;
}
Publié 25 articles originaux · a gagné les éloges 8 · vues 540

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44034698/article/details/104719752
conseillé
Classement